C# 在管理员权限的进程里降权启动一个权限为普通权限的进程

在管理员权限的进程里降权启动一个权限为普通权限的进程,在根据网上的说法尝试了很多方式,要么不成功降权,要么需要账户名+密码。

最终在 https://blog.csdn.net/WPwalter/article/details/88384279#_explorerexe__50 博客中找到一个比较简单的方式。

var subProcessFileName = "C:\Users\walterlv\Desktop\walterlv.exe";
Process.Start("explorer.exe", subProcessFileName);

因为绝大多数用户启动系统的时候,explorer.exe 进程都是处于运行状态,而如果启动一个新的 explorer.exe,都会自动激活当前正在运行的进程而不会启动新的。

于是我们可以委托默认以普通权限运行的 explorer.exe 来代理启动我们需要启动的子进程,这时启动的子进程便是与 explorer.exe 相同权限的,也就是降权运行了。

通过以上代码,walterlv.exe 就会以与 explorer.exe 相同权限运行,也就是降权运行了。

下面的代码,如果发现自己是以管理员权限运行的,那么就降权重新运行自己,然后自己退出。

var identity = WindowsIdentity.GetCurrent();
var principal = new WindowsPrincipal(identity);
if (principal.IsInRole(WindowsBuiltInRole.Administrator))
{
    // 检测到当前进程是以管理员权限运行的,于是降权启动自己之后,把自己关掉。
    Process.Start("explorer.exe", Assembly.GetEntryAssembly().Location);
    Shutdown();
    return;
}

注意:

1. 使用以上方式启动的进程没办法传递初始入参。

组内大佬 @vinpay 提醒,可以先用explorer.exe启动一个中继进程B,有管理员权限的进程A将入参保存到本地,在中继进程启动进程C,并且在本地读取入参,把入参传递给进程C。由于进程B是普通权限,所有启动的进程C也是普通管理员权限。

2. 如果文件地址在C:\Program Files (x86)中,右键exe——复制文件地址,然后粘贴VS替换一个字符串,会出现路径中的Files与(x86)中间的空格被删掉的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值