这个函数有搞头,要调试通过就差不多啦--ImpersonateActiveUserAndRun
2016-07-24 00:55
477 查看
//Function to run a process as active user from windows service void ImpersonateActiveUserAndRun() { DWORD session_id = -1; DWORD session_count = 0; WTS_SESSION_INFOA *pSession = NULL; if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSession, &session_count)) { printf("pSession=====%d\n", pSession); printf("session_count=====%d\n", session_count); } else { printf("WTSEnumerateSessions ===============failed \n"); return; } for (DWORD i = 0; i < session_count; i++) { session_id = pSession[i].SessionId; printf("session_id=====%d\n", session_id); WTS_CONNECTSTATE_CLASS wts_connect_state = WTSDisconnected; WTS_CONNECTSTATE_CLASS* ptr_wts_connect_state = NULL; DWORD bytes_returned = 0; if (::WTSQuerySessionInformation( WTS_CURRENT_SERVER_HANDLE, session_id, WTSConnectState, reinterpret_cast<LPTSTR*>(&ptr_wts_connect_state), &bytes_returned)) { wts_connect_state = *ptr_wts_connect_state; ::WTSFreeMemory(ptr_wts_connect_state); printf("wts_connect_state=====%d\n", wts_connect_state); // if (wts_connect_state != WTSActive) continue; } else { printf("WTSQuerySessionInformation ===============failed \n"); continue; } HANDLE hImpersonationToken = 0; BOOL bRet = WTSQueryUserToken(session_id, &hImpersonationToken); if (bRet == false) { printf(" WTSQueryUserTokenERROR: %d\n", GetLastError()); } printf("hImpersonationToken=====%d\n", hImpersonationToken); //Get real token from impersonation token DWORD neededSize1 = 0; HANDLE *realToken = new HANDLE; if (GetTokenInformation(hImpersonationToken, (::TOKEN_INFORMATION_CLASS) TokenLinkedToken, realToken, sizeof(HANDLE), &neededSize1)) { CloseHandle(hImpersonationToken); hImpersonationToken = *realToken; } else { //log error continue; } } }
相关文章推荐
- Tarjan模板题求割点,桥
- c++学习笔记
- 最长公共子序列求解:递归与动态规划方法
- 遇到很多次,要注意区分service调用,本地用户调用这些区别
- centos 6.5安装GitLab全过程和问题记录
- register,static,const,extern,typedef,volatile的详讲
- Ubuntu 16.04更新软件提示"需要安装不能信任的软件包" http://archive.ubuntukylin.com:10006/ubuntukylin xenial InRelease
- SpringMVC Interceptor
- hdu 2122 Ice_cream’s world III 最小生成树kruskal+并查集
- umask
- Centos7安装完毕后无法联网的解决方法
- 堆排序算法伪代码
- oracle merge into 的例子
- 基于Spring Boot和Spring Cloud实现微服务架构学习(四)-Spring Cloud总结
- TCP
- 单(向)链表
- 贪心算法与动态规划的比较
- Java挑战并发(1):可重入内置锁
- Masonry的屏幕适配的使用
- Java3D导入obj和3ds模型整理