Windows——降权启动程序

news/2024/11/24 4:21:04/

作者:小 琛
欢迎转载,请标明出处

应用场景:运行的程序本身为管理员权限,此时需要启动一个新的程序,该程序需要以普通权限启动。

思路:

  1. 使用 CreateProcessAsUserCreateProcessWithLogonW 等函数创建一个新的进程。这些函数可以指定一个不同权限的用户账户来启动进程,从而实现进程的降权启动。注意,这些函数需要当前程序拥有 SeAssignPrimaryTokenPrivilege 权限,可以通过调用 AdjustTokenPrivileges 函数获取该权限。

  2. 获取新进程的安全标识符(SID),并使用 SetTokenInformation 函数将新进程的安全性设置为普通权限。具体来说,可以使用以下步骤实现:

    • 通过 OpenProcessToken 函数获取当前进程的令牌句柄;
    • 使用 GetTokenInformation 函数获取当前进程令牌的安全标识符;
    • 使用 DuplicateTokenEx 函数创建一个新的安全令牌;
    • 使用 SetTokenInformation 函数将新令牌的安全级别设置为普通权限。
  3. 使用新令牌启动进程。在 CreateProcessAsUserCreateProcessWithLogonW 函数中指定新令牌即可。

BOOL CreateProcessAsUser(std::wstring command_line)
{LOG_INFO << "_CreateProcessAsUser command_line:" << command_line;BOOL ret = FALSE;DWORD u_ExplorerPID;HANDLE hTokenUser = 0;HANDLE h_Token = 0;HANDLE h_Process = 0;STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(STARTUPINFO));ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));si.dwFlags = STARTF_USESHOWWINDOW;si.wShowWindow = SW_SHOWNORMAL;HWND h_Progman = GetShellWindow();GetWindowThreadProcessId(h_Progman, &u_ExplorerPID);h_Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, u_ExplorerPID);OpenProcessToken(h_Process, TOKEN_DUPLICATE, &h_Token);DuplicateTokenEx(h_Token, TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &hTokenUser);ret = CreateProcessWithTokenW(hTokenUser, NULL, NULL, (WCHAR*)command_line.c_str(), NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);if (h_Token) {CloseHandle(h_Token);}if (hTokenUser) {CloseHandle(hTokenUser);}if (h_Process) {CloseHandle(h_Process);}if (!ret) {LOG_INFO << "_CreateProcessAsUser GetLastError:" << GetLastError();}return ret;
}

http://www.ppmy.cn/news/1001439.html

相关文章

vscode添加自定义的用户代码片段

在vscode中添加代码片段 选择“新建全局代码片段文件&#xff0c;然后输入文件名&#xff08;随便输入&#xff09; 然后会生成文件&#xff0c;安装文件中的Example就可以添加代码片段 里面各个字段的含义&#xff1a; "Print to console&#xff1a;代码片段的名称&…

Vue axios + Vue使用

相对于原生的阿贾克斯&#xff0c;axios提供的方法使用起来会更加的简便&#xff0c;之前网络数据获取到了&#xff0c;如何和vue一起使用呢&#xff1f; 网络应用的核心就是data中的数据一部分是通过网络获取到的。所以在方法当中发起网络请求&#xff0c;在响应回来之后将服…

Springboot整合activiti5,达梦数据库,mybatis中间件

Springboot整合activiti5&#xff0c;达梦数据库&#xff0c;mybatis中间件 问题现象解决方案 问题现象 由于工作流引擎不支持达梦数据库以及国产中间件&#xff0c;所以我们引入的时候会报错&#xff0c;这个时候就需要去改造代码和配置文件。各种文档和资料查找一天&#xf…

【微信小程序】导出 Excel 报表并分享,使用xlsx库生成 Excel,使用echars插入图表、使用pdfmake导出为PDF文件

这里写目录标题 生成EXCEL插入汇总和图表导出为PDF 生成EXCEL 要在微信小程序中导出 Excel 报表并分享&#xff0c;可以使用第三方库 xlsx 来生成 Excel 文件&#xff0c;并使用 wx.saveFile 方法将文件保存到本地&#xff0c;然后使用 wx.shareFile 方法来分享文件。 以下是…

Linux 基础知识

Linux 是一种自由和开源的类 Unix 操作系统。Linux 的核心&#xff0c;也被称为 Linux 内核&#xff0c;最初是由 Linus Torvalds 在 1991 年创建的。自那时起&#xff0c;它已经发展成一个稳定、安全且功能丰富的操作系统&#xff0c;被用于许多不同的环境中&#xff0c;包括桌…

elasticsearch 配置用户名和密码

无密码的其他配置项在&#xff1a;https://blog.csdn.net/Xeon_CC/article/details/132064295 elasticsearch.yml配置文件&#xff1a; xpack.security.enabled: true xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: /path/to/elastic-certi…

arcgis字段计算器

1、两字段叠加。要求待叠加的字段类型为文本或字符串类型。如下&#xff1a; 2、字符串部分提取。

每日一题8.3 345

345. 反转字符串中的元音字母 给你一个字符串 s &#xff0c;仅反转字符串中的所有元音字母&#xff0c;并返回结果字符串。 元音字母包括 a、e、i、o、u&#xff0c;且可能以大小写两种形式出现不止一次。 示例 1&#xff1a; 输入&#xff1a;s "hello" 输出&a…