判断程序执行用户和活动用户是否一致

来源:互联网 发布:天地图图层数据标准 编辑:程序博客网 时间:2024/05/03 08:02
 DWORD               dwCount         = 0;  
PWTS_PROCESS_INFOA   pi              = { 0 };  
int                 i               = 0;  
DWORD               dwSize          = 0;  
char               username[128]   = { 0 };  
SID_NAME_USE        nameuse         = SidTypeUser;  

char szUName[128];

DWORD     dwNameSize;

                       char curusername[128]={0};
LPSTR pBuffer = NULL;
DWORD dwBufferLen;

                      //获得当前程序执行用户名

GetUserNameA(szUName,&dwNameSize);

                     //获取活动sessionid

DWORD dCurSessionId= WTSGetActiveConsoleSessionId();

                    //获取活动用户名

WTSQuerySessionInformationA(WTS_CURRENT_SERVER_HANDLE,dCurSessionId,WTSUserName,&pBuffer,&dwBufferLen);
lstrcpyA(curusername ,pBuffer);

WTSFreeMemory(pBuffer);

                   //判断是否相等  关闭进程

if (0!=strcmp(curusername,szUName))
{
HANDLE hProcessHandle; 
ULONG nProcessID;
::GetWindowThreadProcessId( GetSafeHwnd(), &nProcessID );
hProcessHandle = ::OpenProcess( PROCESS_TERMINATE, FALSE,
nProcessID );
BOOL bRet =::TerminateProcess( hProcessHandle, 0 );
}

MessageBoxA(GetSafeHwnd(),szUName,"",0);

                       //枚举进程

if(WTSEnumerateProcessesA(NULL, 0, 1, &pi, &dwCount) ) 
{  
for( i = 0; i < dwCount; i++ )
{  
memset( username, 0, sizeof(char) * 128 );  
dwSize =  128;  
if( LookupAccountSidA(NULL, pi[i].pUserSid, username, &dwSize, NULL, &dwSize, &nameuse) )  
{
char* str = new char[MAX_PATH];
sprintf(str,"Process Name: %s Process Id:   %d Session Id:   %d User Name:    %s",pi[i].pProcessName,pi[i].ProcessId,pi[i].SessionId,username);
MessageBoxA(GetSafeHwnd(),str,"",0);
delete[] str;
}
}  

}


// 获取当前活动的会话id
DWORD WINAPI GetActiveSessionId()
{
PWTS_SESSION_INFOpSessionInfo;
DWORD dwCount = 0;
DWORD dwSessionId = 0;




dwSessionId = ::WTSGetActiveConsoleSessionId();

if (dwSessionId <= 0){
if (!::WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwCount)){
return -1;
}
for (DWORD i = 0; i < dwCount; ++i){
WTS_SESSION_INFO si = pSessionInfo[i];
if (si.SessionId == WTSActive){
dwSessionId = si.SessionId;
break;
}
}
::WTSFreeMemory(pSessionInfo);
}


return dwSessionId;
}


// 当前用户token
BOOL GetCurrentUserToken( HANDLE& h_primaryToken )
{
BOOL bRet = FALSE;
HANDLE h_currentToken = NULL;
DWORD dwSessionId = 0;


dwSessionId = GetActiveSessionId(); //sessionId = 0时错误
if (!::WTSQueryUserToken(dwSessionId, &h_currentToken)){
return bRet;
}
if (!::DuplicateTokenEx(h_currentToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &h_primaryToken)){
return bRet;
}
bRet = TRUE;
return bRet;
}


:CreateProcessAsUser

0 0
原创粉丝点击