restful 根据用户名获取用户

在Windows NT/2000/XP上编写程序时,有时会需要我们获取与当前调用线程关联的用户名和域名(domain),本文下面将示范在Windows NT/2000/XP环境里如何使用Win32 API有关安全的函数来获取用户名和域名。
在Windows NT之前,一般都假设某个线程是运行在登录用户的帐号之下。但Windows NT问世以后,允许线程可以在多个安全上下文中运行,言下之意就是一个线程对多个用户。例如,在客户/服务器(C/S)应用中,服务器的某个线程可以通过 ImpersonateNamedPipeClient 函数模仿一个客户。在这种情况下,它运行在该客户端的用户上下文中。另一个运行在不同安全上下文中的线程例子是服务线程,它具备 NT AUTHORITY 域名和 SYSTEM 用户名,并且运行在本地系统账号之下。
如果当前线程的用户名和域名两者你都需要,则必须首先调用 OpenThreadToken 打开与某个线程关联的存取令牌:

if(!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken)) { 


if(GetLastError() == ERROR_NO_TOKEN) { 

// 

// 如果得不到线程令牌,则试图打开进程令牌。 

// 

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken )) { 

...... 

} 

} 

else { 

// 

// 存取线程令牌出错。 

// 

...... 

} 


...... 

}

如果与当前线程关联的存取令牌不存在,则调用 OpenProcessToken 获取与当前进程关联的存取令牌。
一旦得到线程或进程的存取令牌,便可以调用 GetTokenInformation 函数从线程的存取令牌中获取用户安全标示,也就是 SID: bSuccess = GetTokenInfor

mation(hToken, 
TokenUser, 
InfoBuffer, 
cbInfoBuffer, 
&cbInfoBuffer); 
if(!bSuccess) { 
...... 
} 
else { 
bRet = LookupAccountSid(NULL, ((PTOKEN_USER)InfoBuffer)->User.Sid, 
UserName, 
cchUserName, 
DomainName, 
cchDomainName, 
&snu ); 
if (!bRet) { 
...... 
CloseHandle(hToken); 
...... 
} 
else { 
// 显示得到的 用户名和域名 
SetDlgItemText(IDC_STATIC_USRN,UserName); 
SetDlgItemText(IDC_STATIC_DOMAIN,DomainName); 
...... 
} 
...... 
}

最后,调用 LookupAccountSid 函数获取与该SID关联的账号名和域名,详细实现细节请参考本文的例子代码。图一是例子程序运行的画面:


图一 获取用户名和域名例子程序

在编写本文例子程序时,本来想写一个简单的控制台程序。但是很不幸,我碰到这样一个百思不得其解的问题:在控制台程序中调用LookupAccountSid函数,总是得到一个失败的返回,GetLastError() 函数指示的出错代码是14,也就是"存储器不足,无法完成此操作。"但在非控制台程序中调用是没有问题的。目前我还在继续琢磨这个问题。如果哪位已经知道其中的原因,不妨指点一二,以免我 再走弯路……。为了交流方便,我将控制台程序和非控制台程序的源代码都提供出来,以便参考。
上面提到的几个32位函数不支持 Windows 9x。如果想存取Windows 95 或 Windows 98 系统中的用户名和交互用户的域信息,则必须调用16位LAN Manager 函数。详细实现细节请参考MSDN库的有关内容。
注意:如果仅仅需要获取用户名,那么调用 GetUserName 足矣,这个函数支持 Windows 9x、Windows NT 以及 Windows 2000。在 Windows NT 和 Windows 2000 系统中,此函数首先检查调用线程是否具备专门的存取令牌,如果得到令牌,则返回与调用线程关联的用户名,否则,返回与调用进程关联的用户名。

### 如何在若依系统的 Vue3 项目中获取当前登录用户用户名 #### 使用 Vuex 获取用户名 在若依系统中的 Vue3 项目里,可以通过 Vuex 来集中管理和共享用户的状态数据。具体来说,在组件内部可以访问存储于 Vuex store 中的用户信息。 ```javascript // 组件内获取用户名的例子 export default { computed: { // 访问 Vuex Store 的 state 属性 userName() { return this.$store.state.user.username; } }, } ``` 为了确保能够顺利读取到 `username` 字段,需确认 Vuex store 已经正确配置,并且包含了来自后端响应的数据[^1]。 #### 浏览器本地存储 (localStorage) 另一种方式是在用户成功登录之后把必要的身份验证令牌或用户详情保存至浏览器的 localStorage 或 sessionStorage 中。当页面加载时可以从这些地方检索出之前存入的信息: ```javascript // 存储用户信息到 localStorage localStorage.setItem('userInfo', JSON.stringify(response.data)); // 加载时从 localStorage 取回用户名称 const userInfo = JSON.parse(localStorage.getItem('userInfo')); console.log(userInfo && userInfo.username); ``` 这种方式适用于不需要严格实时更新的应用场景,因为刷新页面后仍能保持会话状态不变[^2]。 #### 调用 API 接口请求最新用户资料 对于更严谨的安全性和准确性考虑,则应该每次进入受保护路由前都向服务器发起一次新的 HTTP 请求以获得最新的认证凭证以及个人信息: ```javascript import axios from 'axios'; async function fetchUserInfo() { try { const response = await axios.get('/api/user/info'); console.log(`Logged-in user's name is ${response.data.username}`); } catch (error) { console.error(error.message); } } fetchUserInfo(); ``` 此方法依赖于后端提供相应的 RESTful API 支持,通常会在返回的对象结构中含有诸如 id, username 等字段[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值