// 创建交互式服务安装完成以后,启动UI的程序
BOOL LaunchApplication(LPCTSTR lpszExecute, LPCTSTR lpszCmdLine)
{BOOL bRet = FALSE;HANDLE hUserTokenDup = NULL;LPVOID pEnv = NULL;do{DWORD dwSessionId = 0;if (0xFFFFFFFF == (dwSessionId = WTSGetActiveConsoleSessionId())) { PRINT(ERR, GetLastError(), TEXT("WTSGetActiveConsoleSessionId")); break; }#define DEFAULT_WINLOGON_APPLICATION      (TEXT("winlogon.exe"))
#define DEFAULT_DEFAULT_APPLICATION     (TEXT("explorer.exe")) // 需要以explorer.exe进程的Token来创建Env环境块,否则以服务启动的App在打开文件路径的方面可能会遇到一些问题,比如最常见的是会访问C:\Windows\System32\config\systemprofile导致访问了错误的位置。DWORD dwWinlogonPid = 0;if (0xFFFFFFFF == (dwWinlogonPid = GetProcessID(DEFAULT_WINLOGON_APPLICATION, dwSessionId))) { PRINT(ERR, TEXT("Get Process ID Failed!")); break; }if (NULL == (hUserTokenDup = GetProcessTokenDup(dwWinlogonPid))) { PRINT(ERR, TEXT("Get Process Duplicate Token Failed!")); break; }if (!AdjustProcessTokenDup(hUserTokenDup, dwSessionId)) { PRINT(ERR, TEXT("Adjust Process Token Failed!")); break; }HANDLE hDefaultTokenDup2 = NULL;DWORD dwDefaultPid = 0;if (0xFFFFFFFF == (dwDefaultPid = GetProcessID(DEFAULT_DEFAULT_APPLICATION, dwSessionId))) { PRINT(ERR, TEXT("Get Process ID Failed!")); break; }if (NULL == (hDefaultTokenDup2 = GetProcessTokenDup(dwDefaultPid))) { PRINT(ERR, TEXT("Get Process Duplicate Token Failed!")); break; }// Create Environment BlockDWORD dwCreateFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;if (CreateEnvironmentBlock(&pEnv, hDefaultTokenDup2, TRUE)) { dwCreateFlags |= CREATE_UNICODE_ENVIRONMENT; }// Launch Process In The Client's Logon SessionTCHAR szExecute[MAX_PATH] = { 0 };GetModuleFileName(NULL, szExecute, _countof(szExecute));_tcsrchr(szExecute, TEXT('\\'))[1] = TEXT('\0');StringCbCat(szExecute, _countof(szExecute) - _tcslen(szExecute), lpszExecute);TCHAR szCmdLine[MAX_PATH] = { 0 };if (NULL != lpszCmdLine) { StringCchPrintf(szCmdLine, _countof(szCmdLine), TEXT("%s"), lpszCmdLine); }#define DEFAULT_DESKTOP_WINSTA0               (TEXT("winsta0\\default"))PROCESS_INFORMATION pi = { 0 };STARTUPINFO si = { sizeof(STARTUPINFO) };si.lpDesktop = DEFAULT_DESKTOP_WINSTA0;if (!CreateProcessAsUser(hUserTokenDup,szExecute,szCmdLine,NULL,NULL,FALSE,dwCreateFlags,pEnv,NULL,&si,&pi)) {PRINT(ERR, GetLastError(), TEXT("CreateProcessAsUser"));break;}CloseHandle(pi.hThread);CloseHandle(pi.hProcess);// CompletedbRet = TRUE;} while (FALSE);if (NULL != pEnv) { DestroyEnvironmentBlock(pEnv);  pEnv = NULL; }if (NULL != hUserTokenDup) { CloseHandle(hUserTokenDup); hUserTokenDup = NULL; }return bRet;
}DWORD GetProcessID(LPCTSTR lpszProcessName, DWORD dwSessionId)
{DWORD dwProcessId = 0xFFFFFFFF;HANDLE hSnapshot = INVALID_HANDLE_VALUE;do{_ASSERT(NULL != lpszProcessName);if (NULL == lpszProcessName) { break; }hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hSnapshot) { PRINT(ERR, GetLastError(), TEXT("CreateToolhelp32Snapshot")); break; }PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };if (!Process32First(hSnapshot, &pe32)) { PRINT(ERR, GetLastError(), TEXT("Process32First")); break; }do{if (0 == _tcsicmp(pe32.szExeFile, lpszProcessName)){DWORD dwProcessSessionId = 0;if (ProcessIdToSessionId(pe32.th32ProcessID, &dwProcessSessionId)&& (dwSessionId == dwProcessSessionId)){dwProcessId = pe32.th32ProcessID;break;}}} while (Process32Next(hSnapshot, &pe32));// Completed} while (FALSE);if (INVALID_HANDLE_VALUE != hSnapshot) { CloseHandle(hSnapshot); hSnapshot = INVALID_HANDLE_VALUE; }return dwProcessId;
}HANDLE GetProcessTokenDup(DWORD dwProcessId)
{HANDLE hProcess = NULL;HANDLE hToken = NULL;HANDLE hTokenDup = NULL;do{if (NULL == (hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwProcessId))) { PRINT(ERR, GetLastError(), TEXT("OpenProcess")); break; }if (!OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID | TOKEN_READ | TOKEN_WRITE,&hToken)){PRINT(ERR, GetLastError(), TEXT("OpenProcessToken"));break;}if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup)) { PRINT(ERR, GetLastError(), TEXT("DuplicateTokenEx")); break; }// Completed} while (FALSE);if (NULL != hToken) { CloseHandle(hToken); hToken = NULL; }if (NULL != hProcess) { CloseHandle(hProcess); hProcess = NULL; }return hTokenDup;
}BOOL AdjustProcessTokenDup(HANDLE hTokenDup, DWORD dwSessionId)
{BOOL bRet = FALSE;do{if (NULL == hTokenDup) { break; }// Adjust Token Privilegesif(!SetTokenInformation(hTokenDup, TokenSessionId, (LPVOID)&dwSessionId, sizeof(dwSessionId))) { PRINT(ERR, GetLastError(), TEXT("SetTokenInformation")); break; }if (!AdjustTokenDupPrivileges(hTokenDup, SE_DEBUG_NAME)) { PRINT(ERR, TEXT("Enable SE_DEBUG_NAME Privilege Failed!")); }if (!AdjustTokenDupPrivileges(hTokenDup, SE_TCB_NAME)) { PRINT(ERR, TEXT("Enable SE_TCB_NAME Privilege Failed!")); }if (!AdjustTokenDupPrivileges(hTokenDup, SE_CHANGE_NOTIFY_NAME)) { PRINT(ERR, TEXT("Enable SE_CHANGE_NOTIFY_NAME Privilege Failed!")); }if (!AdjustTokenDupPrivileges(hTokenDup, SE_INCREASE_QUOTA_NAME)) { PRINT(ERR, TEXT("Enable SE_INCREASE_QUOTA_NAME Privilege Failed!")); }if (!AdjustTokenDupPrivileges(hTokenDup, SE_ASSIGNPRIMARYTOKEN_NAME)) { PRINT(ERR, TEXT("Enable SE_ASSIGNPRIMARYTOKEN_NAME Privilege Failed!")); }// CompletedbRet = TRUE;} while (FALSE);return bRet;
}BOOL AdjustTokenDupPrivileges(HANDLE hTokenDup, LPCTSTR lpszPrivileges)
{BOOL bRet = FALSE;do{LUID luid = { 0 };if (!LookupPrivilegeValue(NULL, lpszPrivileges, &luid)){PRINT(ERR, GetLastError(), TEXT("LookupPrivilegeValue"));break;}TOKEN_PRIVILEGES tp = { 0 };tp.PrivilegeCount = 1;tp.Privileges[0].Luid = luid;tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;// Adjust token privilegesif (!AdjustTokenPrivileges(hTokenDup, FALSE, &tp, sizeof(tp), NULL, NULL)){PRINT(ERR, GetLastError(), TEXT("AdjustTokenPrivileges"));break;}// CompletedbRet = TRUE;} while (FALSE);return bRet;
}void PRINT(DWORD dwLevel, LPCTSTR lpszFormat, ...)
{do{if (!m_bDbgValid) { break; }TCHAR szText[DEFAULT_PRINTF_BUFFER_LENGTH] = { 0 };TCHAR szBuffer[DEFAULT_PRINTF_BUFFER_LENGTH] = { 0 };// Parse Parameterva_list args;va_start(args, lpszFormat);StringCchVPrintf(szBuffer, _countof(szBuffer), lpszFormat, args);va_end(args);// FormatFORMAT(szText, _countof(szText), szBuffer);// DumpDUMP(dwLevel, szText);} while (FALSE);
}void PRINT(DWORD dwLevel, DWORD dwErrorId, LPCTSTR lpszDescription)
{do{if (!m_bDbgValid) { break; }TCHAR szText[DEFAULT_PRINTF_BUFFER_LENGTH] = { 0 };// FormatFORMAT(szText, _countof(szText), dwErrorId, lpszDescription);// DumpDUMP(dwLevel, szText);} while (FALSE);
}void CCommon::FORMAT(LPTSTR lpszText, size_t nLength, LPCTSTR lpszInfo)
{_ASSERT(NULL != lpszText);_ASSERT(nLength > 0);_ASSERT(NULL != lpszInfo);SYSTEMTIME st = { 0 };GetLocalTime(&st);StringCchPrintf(lpszText, nLength, TEXT("[%04d-%02d-%02d %02d:%02d:%02d.%03d] - %s\r\n"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds,lpszInfo);
}void FORMAT(LPTSTR lpszText, size_t nLength, DWORD dwErrorId, LPCTSTR lpszDescription)
{_ASSERT(NULL != lpszText);_ASSERT(nLength > 0);_ASSERT(NULL != lpszDescription);SYSTEMTIME st = { 0 };GetLocalTime(&st);TCHAR szBuffer[DEFAULT_PRINTF_BUFFER_LENGTH] = { 0 };FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrorId, LANG_NEUTRAL, (LPTSTR)szBuffer, _countof(szBuffer), NULL);StringCchPrintf(lpszText,nLength,TEXT("[%04d-%02d-%02d %02d:%02d:%02d.%03d] - Call %s() Failed with Error: %d - %s\r\n"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond,st.wMilliseconds,lpszDescription,dwErrorId,szBuffer);}

登录系统以后,在Windows服务进程中启动需管理员权限(带盾牌图标)的应用程序相关推荐

  1. Win7编程:在按钮中加入管理员权限运行盾牌图标--转载

    下文分两部分,第一,如何实现软件本身运行时申请管理员权限,第二,如何在软件窗体内的按钮上面加入盾牌图标(意味着本功能需要管理员权限执行). 一.软件自身运行时的管理员权限申请机制 在开启UAC的时候, ...

  2. centos系统在Visual Studio Code 中使用超级管理员权限保存文件

    第一种:使用root权限运行vscode sudo code --user-data-dir ="~/.vscode-root" 第二种: 在桌面图标处更改权限 每次更改之后会提示 ...

  3. win10管理员权限怎么获得_实用技巧:如何在win10中安装没有管理员权限的软件...

    通常,我们可能会遇到需要在Windows 10电脑上安装软件,但在该电脑上没有管理员权限的情况,由于不是管理员,所以无权在在电脑上安装软件,这让人非常苦恼. 事实上,这是微软专门设计的一个安全功能,它 ...

  4. 在Windows 10中启动WSL2 并安装Linux( Ubuntu 为例)并运行docker

    本文内容: 了解WSL和WSL2: 案例:在Windows 10 上开启WSL2并安装Ubuntu: 案例:体验在WSL2中的Ubuntu 安装Docker 并运行 nginx: 视频讲解: 在作者博 ...

  5. 如何用访客帐户登录计算机,如何在Windows 10中创建访客帐户 | MOS86

    如果您发现客人经常询问您是否临时使用电脑检查他们的电子邮件或在网上查找内容,则不必让他们使用您的个人帐户或为每个客人创建一个特殊帐户. 相关文章图片1tupian为什么您的计算机上的每个用户都应该拥有 ...

  6. 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...

    移动硬盘更改驱动器号和路径 Whenever you save a new file in Windows 10, the Save As window defaults to whichever o ...

  7. Linux开发_最全在Ubnutu环境下为你的程序设置快捷启动项和启动时管理员权限

    一般情况下,我们写了一个GUI程序,想要像火狐或者等其它程序一样在桌面显示我们的快捷方式,并且单击就可以启动,不需要使用终端命令行的方法和Windows有很大的区别 Windows上的EXE程序点击W ...

  8. 计算机管理员用户被禁用,Windows 10 账户没有了管理员权限或唯一的管理员账户被禁用了,怎么办!...

    技术级别 : 基本 摘要 由于某些原因,导致当前用户账户被设置为非管理员账户.或者在运行程序时提示要输入管理员密码,,但却没地方能够输入.这类情况下,需要进入安全模式重新设定用户账户权限.适用于: W ...

  9. Windows安全不能靠本地管理员权限

    删除本地管理员权限是一个提高Windows安全的有效方法,但有关撤销用户桌面控制权的政策往往对管理员造成阻碍,使其无法利用这一有效方法. 当用户具有本能管理权限时,他们可以在自己的工作区做任何想做的事 ...

最新文章

  1. win32 api setwindowlong 第2个参数_第 6 篇:分页接口
  2. JavaScript异步精讲,让你更加明白Js的执行流程!
  3. php语言中 类的关键词是,c语言中的关键字有哪些类型?
  4. VTK:PolyData之IntersectionPolyDataFilter
  5. 网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?
  6. (*长期更新)软考网络工程师学习笔记——Section 10 网络安全
  7. 页面监听,一段时间内不操作网页,就自动跳转到登录页
  8. 够学习一辈子的生活经典
  9. 知道的C君带你学语言的作业答案,知到《C君带你玩编程》2020章节测试(含答案)...
  10. SpringBoot2.1.5(39)--- 开发restful 风格Api
  11. ASP.NET MVC TagBuilder使用
  12. Ubuntu上安装GCC编译器
  13. 〖Demo〗-- 多级评论
  14. 计算机毕业设计Java蔚蓝在线学习平台(源码+系统+mysql数据库+Lw文档)
  15. 几种有趣的Magic Matrix
  16. php第三方分享插件下载地址,PhpWind安装分享插件
  17. Eclipse使用:Eclipse安装中文语言包
  18. js实现图片的透明度运动
  19. 身为码农,为 12306 说两句公道话
  20. HTML中关于使用 innerHTML 动态创建DOM节点时,相关事件(如onclick等)失效的解决方案

热门文章

  1. uniapp中使用百度API实现全景地图(仅支持H5)
  2. fopen函数返回值总为NULL
  3. [译] TensorFlow 教程 #11 - 对抗样本
  4. 功能:手机来电话,闪光灯闪烁提示
  5. 微搭低代码实现用户登录及注册功能
  6. 用计算机时按错了按什么键,电脑键盘不能打字了按哪个键恢复?
  7. 【Ubuntu 】下安装 SSH 和 Finalshell 工具实现 SSH登录
  8. Android模拟器怎么root
  9. dos2unix 目录下所有文件
  10. 苹果手机发热怎么办?