我们需要运行一个需要登录用户的用户名的程序。该程序以管理员权限运行,因为它是由 WinRM 推送的。作为普通用户,程序返回用户,但是当以管理员身份运行时,我收到 OpenProcessToken 错误 6。如果有其他方法来获取登录用户的用户名,我想知道。
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#pragma comment(lib, "advapi32.lib")
#define MAX_NAME 256
BOOL SearchTokenGroupsForSID (VOID)
{
DWORD i, dwSize = 0, dwResult = 0;
HANDLE hToken;
PTOKEN_USER pUserInfo;
SID_NAME_USE SidType;
char lpName[MAX_NAME];
char lpDomain[MAX_NAME];
PSID pSID = NULL;
char *procname = "explorer.exe";
int pid = 0;
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, procname) == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
pid = entry.th32ProcessID;
if (!OpenProcessToken( hProcess, TOKEN_QUERY, &hToken ))
{
printf( "OpenProcessToken Error %u\n", GetLastError() );
return FALSE;
}
CloseHandle(hProcess);
}
}
}
printf("pid of %s: %d\n", procname, pid);
if(!GetTokenInformation(hToken, TokenUser, NULL, dwSize, &dwSize))
{
dwResult = GetLastError();
if( dwResult != ERROR_INSUFFICIENT_BUFFER ) {
printf( "GetTokenInformation Error %u\n", dwResult );
return FALSE;
}
}
pUserInfo = (PTOKEN_USER) GlobalAlloc( GPTR, dwSize );
if(! GetTokenInformation(hToken, TokenUser, pUserInfo,
dwSize, &dwSize ) )
{
printf( "GetTokenInformation Error %u\n", GetLastError() );
return FALSE;
}
dwSize = MAX_NAME;
if( !LookupAccountSid( NULL, pUserInfo->User.Sid,
lpName, &dwSize, lpDomain,
&dwSize, &SidType ) )
{
dwResult = GetLastError();
if( dwResult == ERROR_NONE_MAPPED )
strcpy_s (lpName, dwSize, "NONE_MAPPED" );
else
{
printf("LookupAccountSid Error %u\n", GetLastError());
return FALSE;
}
}
printf( "Current user is a member of the %s\\%s group\n",
lpDomain, lpName );
if (pSID)
FreeSid(pSID);
if ( pUserInfo )
GlobalFree( pUserInfo );
return TRUE;
}
int main(void)
{
SearchTokenGroupsForSID();
return 0;
}
我很快就解决了这个问题。我认为其他用户可能想知道如何删除该线程,而不是删除该线程。
OpenProcess()
的第一个参数应该是 PROCESS_QUERY_INFORMATION
而不是 PROCESS_ALL_ACCESS