資源簡介
在用戶已經登錄了WINDOWS的情況下,普通程序通過GetUserName可以獲得當前登錄的用戶名,但是在服務模式下,卻是無法獲得正確的信息,并且無法判斷用戶是否登錄。本函數很簡潔,用來支持在服務模式下能判斷出是否有用戶進行了登錄,用戶是否登出等狀態,并且能夠獲得登錄用戶的用戶名。
這段代碼主要是給服務程序使用的,代碼為C++代碼,VS2013編譯通過,希望能幫助到有同樣困惑的朋友。

代碼片段和文件信息
//?GetCurrentLogonUser.cpp?:?定義控制臺應用程序的入口點。
//
#include?“stdafx.h“
#include?
#include?
#pragma?comment(lib?“Psapi.lib“)
DWORD?GetProcessIDFromName(char?*name)
{
HANDLE?snapshot;
PROCESSENTRY32?processinfo;
processinfo.dwSize?=?sizeof(processinfo);
snapshot?=?CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS?0);
if?(snapshot?==?NULL)
return?FALSE;
BOOL?status?=?Process32First(snapshot?&processinfo);
while?(status)
{
if?(_stricmp(name?processinfo.szExeFile)?==?0)
return?processinfo.th32ProcessID;
status?=?Process32Next(snapshot?&processinfo);
}
return?-1;
}
/*
??Get_LogUser?函數說明
??參數?lpUserName?為用來輸出登錄用戶名的內存,以字符串方式
????????nNameLen???為內存大小
返回值:如果windows有用戶登錄了,會返回true,并且lpUserName?不為空字符串,否則返回false,并且lpUserName為空字符串
??補充說明:
??這個函數和GetUserName不同處在于,GetUserName不支持服務,這個函數支持服務模式。如果在服務模式下,系統開機就會自啟動的服務,通過GetUserName
????獲得的用戶永遠是SYSTEM,即使這期間用戶進行了登錄,也不會返回正確的用戶信息,而該函數會執行正確的結果。
??如果您有興趣,可以讓該函數每隔幾秒執行一次,并且寫入到文件里,來觀看執行結果,就會發現當系統【啟動中】但是還沒有執行用戶登錄時,
??會返回false,一旦用戶登錄了,就會返回當前登錄的用戶名。
??
??本程序代碼來源于網絡,本人只做了簡單的修改,再次發布于網絡,因為這個問題困擾了我一天時間來搞定,希望能幫助需要他的人。
*/
bool?Get_LogUser(char?*lpUserName?DWORD?nNameLen)
{
DWORD?dwProcessID?=?GetProcessIDFromName(“explorer.exe“);
if?(dwProcessID?==?0)
return?false;
BOOL?fResult?=?FALSE;
HANDLE?hProc?=?NULL;
HANDLE?hToken?=?NULL;
TOKEN_USER?*pTokenUser?=?NULL;
__try
{
//?Open?the?process?with?PROCESS_QUERY_INFORMATION?access
hProc?=?OpenProcess(PROCESS_QUERY_INFORMATION?FALSE?dwProcessID);
if?(hProc?==?NULL)
{
return?false;
}
fResult?=?OpenProcessToken(hProc?TOKEN_QUERY?&hToken);
if?(!fResult)
{
return?false;
}
DWORD?dwNeedLen?=?0;
fResult?=?GetTokenInformation(hToken?TokenUser?NULL?0?&dwNeedLen);
if?(dwNeedLen?>?0)
{
pTokenUser?=?(TOKEN_USER*)new?BYTE[dwNeedLen];
fResult?=?GetTokenInformation(hToken?TokenUser?pTokenUser?dwNeedLen?&dwNeedLen);
if?(!fResult)
{
return?false;
}
}
else
{
return?false;
}
SID_NAME_USE?sn;
TCHAR?szDomainName[MAX_PATH];
DWORD?dwDmLen?=?MAX_PATH;
fResult?=?LookupAccountSid(NULL?pTokenUser->User.Sid?lpUserName?&nNameLen
szDomainName?&dwDmLen?&sn);
}
__finally
{
if?(hProc)
::CloseHandle(hProc);
if?(hToken)
::CloseHandle(hToken);
if?(pTokenUser)
delete[](char*)pTokenUser;
}
return?true;
}
int?_tmain(int?argc?_TCHAR*?argv[])
{
char?szCurUser[1024];
DWORD?dwCurUserBufSize?=?sizeof(szCurUser);
bool?bRet?=?Get_LogUser(szCurUser?dwCurUserBufSize);
if?(bRet)
{
printf(“Current?user?is:%s\n“?szCurUser);
}
else
{
printf(“Function?failed!\n“);
}
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????32768??2018-05-01?15:04??GetCurrentLogonUser\Debug\GetCurrentLogonUser.exe
?????文件?????257208??2018-05-01?15:04??GetCurrentLogonUser\Debug\GetCurrentLogonUser.ilk
?????文件?????708608??2018-05-01?15:04??GetCurrentLogonUser\Debug\GetCurrentLogonUser.pdb
?????文件???????3078??2018-05-01?15:04??GetCurrentLogonUser\GetCurrentLogonUser\GetCurrentLogonUser.cpp
?????文件???????4329??2018-05-01?14:45??GetCurrentLogonUser\GetCurrentLogonUser\GetCurrentLogonUser.vcxproj
?????文件???????1326??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser\GetCurrentLogonUser.vcxproj.filters
?????文件???????1594??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser\ReadMe.txt
?????文件????????225??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser\stdafx.cpp
?????文件????????234??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser\stdafx.h
?????文件????????236??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser\targetver.h
?????文件???????1003??2018-05-01?14:42??GetCurrentLogonUser\GetCurrentLogonUser.sln
????..A..H.?????20480??2018-05-01?15:07??GetCurrentLogonUser\GetCurrentLogonUser.v12.suo
?????目錄??????????0??2018-05-01?15:07??GetCurrentLogonUser\GetCurrentLogonUser\Debug
?????目錄??????????0??2018-05-01?14:49??GetCurrentLogonUser\Debug
?????目錄??????????0??2018-05-01?15:04??GetCurrentLogonUser\GetCurrentLogonUser
?????目錄??????????0??2018-05-01?15:07??GetCurrentLogonUser
-----------?---------??----------?-----??----
??????????????1031089????????????????????16
- 上一篇:kdtree的源碼C語言版
- 下一篇:C++截圖、抓屏程序
評論
共有 條評論