2008年(909)
分类:
2008-05-06 21:44:54
下载源代码
在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 获取与当前进程关联的存取令牌。
bSuccess = GetTokenInformation(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关联的账号名和域名,详细实现细节请参考本文的例子代码。图一是例子程序运行的画面: