首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

取得當前執行緒關聯使用者與網域名稱:OpenThreadToken 與 LookupAccountSid 完整實作

     編輯:關於VC++

Windows NT 系列允許執行緒在不同安全性內容下運行(模擬、服務帳號)。若需取得「目前執行緒實際關聯」的使用者與網域名稱,必須存取執行緒/進程 Token 並解析 SID。

核心流程

  1. OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken) 取得執行緒 Token;失敗且 ERROR_NO_TOKEN 則 OpenProcessToken(GetCurrentProcess(), ...) 取得進程 Token。
  2. GetTokenInformation(hToken, TokenUser, ...) 取得 TOKEN_USER 結構中的 SID。
  3. LookupAccountSid(NULL, pTokenUser->User.Sid, UserName, ..., DomainName, ..., &sn) 解析 SID 為使用者名稱與網域名稱。

完整代碼

BOOL GetThreadUserDomain(TCHAR* szUser, DWORD cchUser, TCHAR* szDomain, DWORD cchDomain) {
    HANDLE hToken = NULL; BYTE buf[1024]; DWORD dwLen = 0; BOOL bOk = FALSE;
    if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hToken)) {
        if (GetLastError() == ERROR_NO_TOKEN)
            OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken);
        else return FALSE;
    }
    if (GetTokenInformation(hToken, TokenUser, buf, sizeof(buf), &dwLen)) {
        PTOKEN_USER pUser = (PTOKEN_USER)buf;
        SID_NAME_USE snu;
        bOk = LookupAccountSid(NULL, pUser->User.Sid, szUser, &cchUser, szDomain, &cchDomain, &snu);
    }
    CloseHandle(hToken); return bOk;
}

控制台專案疑難雜症

作者發現控制台應用程式呼叫 LookupAccountSid 總是失敗,GetLastError() == 14(儲存空間不足),而 GUI 專案正常。原因未明,文中提供雙版本原始碼供參考。

補充說明

  • 僅需使用者名稱:GetUserName 支援 Win9x/NT/2000,自動檢查執行緒/進程 Token。
  • Win9x 不支援上述安全性 API,需改用 16 位元 LAN Manager API。
  • 範例程式為 MFC 對話框專案,介面顯示取得的使用者與網域名稱。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved