서비스 프로그램 에서 현재 로그 인 사용자 이름 을 어떻게 얻 습 니까?
이것 도 개발 과정 에서 자주 발생 하 는 문제 입 니 다. 서비스 프로그램 은 system 신분 으로 실행 되 기 때문에 getusername 을 직접 사용 하면 안 됩 니 다.그러나 내 가 지난 글 에서 생각 한 것 을 사용 하면 이 문제 도 쉽게 풀 릴 수 있다.방법 은 셸 의 token 을 얻 을 수 있 습 니 다. 이 token 에 따라 Sid 를 얻 고 Sid 에 따라 현재 로그 인 한 사용자 이름과 domain 을 얻 을 수 있 습 니 다.다음은 예제 코드 입 니 다.
//根据进程名称得到进程token
BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
{
	if(!lpName)
	{
		return FALSE;
	}
	HANDLE         hProcessSnap = NULL; 
	BOOL           bRet      = FALSE; 
	PROCESSENTRY32 pe32      = {0}; 
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE) 
		return (FALSE); 
	pe32.dwSize = sizeof(PROCESSENTRY32); 
	if (Process32First(hProcessSnap, &pe32)) 
	{
		do 
		{
			if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
			{
				HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
					FALSE,pe32.th32ProcessID);
				bRet = OpenProcessToken(hProcess, TOKEN_ALL_ACCESS,&hToken);
				CloseHandle (hProcessSnap); 
				return (bRet);
			}
		} 
		while (Process32Next(hProcessSnap, &pe32)); 
		bRet = TRUE; 
	} 
	else 
		bRet = FALSE;
	CloseHandle (hProcessSnap); 
	return (bRet);
}
BOOL GetCurrentUserName()
{
	HANDLE hToken;
	//得到shell的token
	if(!GetTokenByName(hToken,"EXPLORER.EXE"))
	{
		return FALSE;
	}
	DWORD        cbti     = 0;
	PTOKEN_USER  ptiUser  = NULL;
	SID_NAME_USE snu;
	//取得所需空间大小
	if (GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti)) 
	{
		CloseHandle(hToken);
		return FALSE;
	}
	//分配空间
	ptiUser = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbti);
	if(!ptiUser)
	{
		CloseHandle(hToken);
		return FALSE;
	}
	//取得token信息
	if (!GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti))
	{
		CloseHandle(hToken);
		HeapFree(GetProcessHeap(), 0, ptiUser);
		return FALSE;
	}
	char szUser[50];
	char szDomain[50];
	DWORD nUser = 50;
	DWORD nDomain = 50;
	//根据用户的sid得到用户名和domain
	if (!LookupAccountSid(NULL, ptiUser->User.Sid, szUser, &nUser, 
		szDomain, &nDomain, &snu))
	{
		CloseHandle(hToken);
		HeapFree(GetProcessHeap(), 0, ptiUser);
		return FALSE;
	}
	OutputDebugString(szUser);
	OutputDebugString("\r
");
	OutputDebugString(szDomain);
	OutputDebugString("\r
");
	CloseHandle(hToken);
	HeapFree(GetProcessHeap(), 0, ptiUser);
	return TRUE;
}이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.