当前位置: 首页 > news >正文

Window指定用户运行程序

Linux下可以通过seteuid seteguid等api设置程序运行用户,window下通过CreateProcessWithTokenW达到类似效果,原理是先找到目标用户下的一个进程,获取到它的token,再创建进程,代码如下:

#include <Windows.h> #include <TlHelp32.h> #include <Userenv.h> #include <stdio.h> static BOOL EnablePrivilege(LPCWSTR lpszPrivilege) { HANDLE hToken = NULL; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE; TOKEN_PRIVILEGES tp; ZeroMemory(&tp, sizeof(tp)); tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValueW(NULL, lpszPrivilege, &tp.Privileges[0].Luid); AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL); CloseHandle(hToken); return TRUE; } static BOOL GetProcessUserName(DWORD dwPid, LPWSTR szUserName, DWORD dwNameSize) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPid); if (!hProcess) return FALSE; HANDLE hToken = NULL; if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) { CloseHandle(hProcess); return FALSE; } DWORD dwLen = 0; GetTokenInformation(hToken, TokenUser, NULL, 0, &dwLen); PTOKEN_USER pTokenUser = (PTOKEN_USER)LocalAlloc(LPTR, dwLen); BOOL bOk = FALSE; if (GetTokenInformation(hToken, TokenUser, pTokenUser, dwLen, &dwLen)) { SID_NAME_USE sidType; WCHAR szDomain[256] = { 0 }; DWORD dwDomainLen = 256; if (LookupAccountSidW(NULL, pTokenUser->User.Sid, szUserName, &dwNameSize, szDomain, &dwDomainLen, &sidType)) { bOk = TRUE; } } LocalFree(pTokenUser); CloseHandle(hToken); CloseHandle(hProcess); return bOk; } DWORD FindProcessIdByUserName(LPCWSTR szTargetUserName) { HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap == INVALID_HANDLE_VALUE) return 0; PROCESSENTRY32W pe; pe.dwSize = sizeof(pe); if (!Process32FirstW(hSnap, &pe)) { CloseHandle(hSnap); return 0; } do { WCHAR szProcessUser[256] = { 0 }; if (GetProcessUserName(pe.th32ProcessID, szProcessUser, 256)) { if (_wcsicmp(szProcessUser, szTargetUserName) == 0) { CloseHandle(hSnap); return pe.th32ProcessID; } } } while (Process32NextW(hSnap, &pe)); CloseHandle(hSnap); return 0; } HANDLE CreateProcessByUserToken(DWORD dwPid, LPCWSTR cmdline, HANDLE logFile) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPid); if (!hProcess) return INVALID_HANDLE_VALUE; HANDLE hToken = NULL; OpenProcessToken(hProcess, TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE, &hToken); HANDLE hPrimaryToken = NULL; DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, TokenPrimary, &hPrimaryToken); LPVOID pEnv = NULL; CreateEnvironmentBlock(&pEnv, hPrimaryToken, FALSE); STARTUPINFOW si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = logFile; si.hStdError = logFile; si.hStdInput = NULL; si.lpDesktop = L"WinSta0\\Default"; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); WCHAR cmd[4096] = { 0 }; wcscpy(cmd, cmdline); BOOL bOk = CreateProcessWithTokenW( hPrimaryToken, LOGON_WITH_PROFILE, NULL, cmd, CREATE_UNICODE_ENVIRONMENT, pEnv, NULL, &si, &pi ); if (bOk) { CloseHandle(pi.hThread); } if (pEnv) DestroyEnvironmentBlock(pEnv); CloseHandle(hPrimaryToken); CloseHandle(hToken); CloseHandle(hProcess); return pi.hProcess; } HANDLE CreateProcessNormal(LPCWSTR cmdline, HANDLE logFile) { STARTUPINFOW si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USESTDHANDLES; si.hStdOutput = logFile; si.hStdError = logFile; si.hStdInput = NULL; si.lpDesktop = L"WinSta0\\Default"; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); WCHAR cmd[4096] = { 0 }; wcscpy(cmd, cmdline); BOOL ok = CreateProcessW( NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi ); if (!ok) return INVALID_HANDLE_VALUE; CloseHandle(pi.hThread); return pi.hProcess; } BOOL IsAdmin() { BOOL isAdmin = FALSE; PSID adminGroup = NULL; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &adminGroup ); CheckTokenMembership(NULL, adminGroup, &isAdmin); FreeSid(adminGroup); return isAdmin; } HANDLE CreateLogFile(long long key) { WCHAR fileName[260]; swprintf(fileName, 260, L"%lld.log", key); SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; return CreateFileW( fileName, FILE_APPEND_DATA, FILE_SHARE_READ, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); } HANDLE RunProcessAsUser(LPCWSTR szUserName, LPCWSTR cmd, HANDLE logFile) { if (!IsAdmin()) return CreateProcessNormal(cmd, logFile); if (!szUserName || szUserName[0] == L'\0') return CreateProcessNormal(cmd, logFile); EnablePrivilege(SE_DEBUG_NAME); EnablePrivilege(SE_IMPERSONATE_NAME); EnablePrivilege(SE_ASSIGNPRIMARYTOKEN_NAME); EnablePrivilege(SE_INCREASE_QUOTA_NAME); DWORD pid = FindProcessIdByUserName(szUserName); if (pid == 0) return CreateProcessNormal(cmd, logFile); return CreateProcessByUserToken(pid, cmd, logFile); } HANDLE RunProcessAsUserA(const char* szUserNameA, const char* cmdA, HANDLE logFile) { WCHAR szUserNameW[256] = { 0 }; WCHAR cmdW[4096] = { 0 }; if (szUserNameA) MultiByteToWideChar(CP_UTF8, 0, szUserNameA, -1, szUserNameW, 256); if (cmdA) MultiByteToWideChar(CP_UTF8, 0, cmdA, -1, cmdW, 4096); return RunProcessAsUser(szUserNameW, cmdW, logFile); } int main() { HANDLE logFile = CreateLogFile(123123); RunProcessAsUserA("test", "cmd.exe /c \"notepad.exe 1.txt\"", logFile); return 0; }
http://www.jsqmd.com/news/595691/

相关文章:

  • Graphormer模型推理加速:利用.accelerate库优化计算性能
  • Qwen3.5-9B-AWQ-4bit Python数据分析环境搭建:Anaconda集成与模型调用
  • 永恒之蓝的复现
  • OpenClaw研究助手:Qwen3.5-9B驱动的文献综述自动化
  • Wan2.2-I2V-A14B提示词工程入门:如何用文本描述引导视频生成风格
  • RTX4090D 24G显存优化:HunyuanVideo-Foley私有部署完整流程
  • SegDINO实战:如何用冻结DINOv3+轻量解码器搞定医学图像分割(附源码调优技巧)
  • Flowable UI 6.6.0 生产环境部署踩坑实录:从H2内存库迁移到PostgreSQL的全过程
  • 空洞骑士模组管理终极指南:Scarab让你轻松安装所有模组
  • GLM-4.1V-9B-Base在文旅场景应用:景区导览图识别与多语种解说生成
  • SPIRAN ART SUMMONER图像生成:5分钟零基础搭建《最终幻想10》风格AI画板
  • PyTorch 2.8模型可视化艺术:使用Visio绘制神经网络架构图
  • Asian Beauty Z-Image Turbo 风格迁移作品展:将经典名画风格融入现代人像
  • AI Agent核心引擎:使用Phi-4-mini-reasoning构建可规划与执行的智能体
  • 春联生成模型安装包制作:一键部署exe工具开发
  • 开源3MF工作流优化指南:Blender3mfFormat插件从基础到智能制造的实践应用
  • Wan2.2-I2V-A14B开源大模型:支持ONNX导出与边缘设备轻量化部署
  • CogVideoX-2b CSDN专用镜像深度体验:从文字到高清视频,只需点几下鼠标
  • VS Code 设置插件默认安装路径
  • Diffusion模型超参数调优指南:以StanfordCars数据集为例
  • 零基础玩转Qwen3-VL-8B:上传图片提问,本地AI助手秒答
  • 千问3.5-2B开源可部署教程:基于CSDN GPU平台,5分钟完成图文理解服务上线
  • kimi-cli 服务形式启动,kimi-cli无头模式 kimi-cli web启动,
  • SUPER COLORIZER赋能Java应用:SpringBoot集成智能图像上色服务
  • 基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现
  • 2026广告机厂家推荐榜TOP5
  • Face3D.ai Pro零基础入门:5分钟从照片到3D人脸,小白也能玩转
  • Z-Image-GGUF文生图模型问题解决:常见报错处理,让AI绘画更顺畅
  • SDMatte模型推理性能优化:从算法到GPU算力的全方位调优
  • 科研写作利器:ChatGPT高效Prompt全攻略