博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断程序执行用户和活动用户是否一致
阅读量:2377 次
发布时间:2019-05-10

本文共 2273 字,大约阅读时间需要 7 分钟。

 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_INFO pSessionInfo;
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

转载地址:http://reoxb.baihongyu.com/

你可能感兴趣的文章
灵活的string类与istringstream的联合使用
查看>>
高斯信道下信号相位估计
查看>>
C++中可变参函数的几种实现方法
查看>>
C++中使用vector动态创建多维数组
查看>>
进程join和detach注意事项
查看>>
C++原子操作atomic库介绍
查看>>
C++多线程内存模型
查看>>
C++并发数据结构的内存回收
查看>>
转发与重定向
查看>>
隐式对象简介(转载)
查看>>
使用了request.setCharacterEncoding()方法却解决不了中文乱码原因(转载)
查看>>
读取Properties文件读取,路径,空格,中文问题
查看>>
转发与重定向的路径问题(转)
查看>>
Integer.parseInt(s) 和 Integer.valueOf(s)详细区别(转)
查看>>
Cookie 跨域访问转自(http://qingfeng825.javaeye.com/)
查看>>
深入Java核心 Java内存分配原理精讲(转)
查看>>
全面分析Java的垃圾回收机制(转)
查看>>
Struts 与 dojo 整合研究 (一)
查看>>
Servlet线程,工作原理及3.0新特性
查看>>
Struts2与Struts1.x的深度比较
查看>>