sudo: apt-get:找不到命令_搞个Windows的sudo(伪)

c795f8e299f4aa8cde3f98ffbfd9eb09.png

今天折腾新装好的Windows,需要安装好多环境。包括 Python、C/C++、MSYS。现在在 Windows 上写入C:Program Files需要管理员+ UAC 高令牌等级。如果是提供安装包的软件的话,直接双击,装着装着自然会叫你授予权限的。但是如果在命令行下面,像 pip 之类的软件就不会出现请求授权的弹窗而是直接告诉你失败了。一般 Linux 用户很少遇到这种情况(感谢 polkit),万一遇到了直接输入<del>fuck</del> sudo+原来的命令就好了。

但是倒霉的Windows用户就不行了。这个系统原来有的 runas.exe 这种类似 sudo 的程序因为 UAC 的存在已经拿不到高层级的特权了(而且本来大多数用户本身用的帐号就是管理员嘛,至于为什么可以看runas 命令在不同环境下的表现)。对于开启了UAC的电脑来说,switch user 都是假的,想办法提升 UAC 令牌等级才是真。

之后我瞄上了 Powershell 的 Start-Process,发现它的Verb选项的RunAs参数可以提出UAC授权请求。于是我在 Powershell 的 profile 里写下了这样的一段代码:

function SwitchUser-Do {
    if($args.Length -lt 1) {
        Write-Warning("program must be provided!")
        Write-Output("Usage: sudo program [args...]")
        return
    }
    $program = $args[0]
    $prog_args = $args[1..($args.Count-1)]
    Write-Output("Program: " + $program)
    if ($args.Length -le 1) {
        Start-Process -FilePath $program -Verb RunAs
    }
    else {
        Write-Output("Arguments: " + $prog_args)
        Start-Process -FilePath $program -Verb RunAs -ArgumentList $prog_args
    }
}

Set-Alias sudo SwitchUser-Do

写着这个 Powershell 脚本总感觉不舒服,可能用微软家的东西就是这种感觉吧……

之后是测试:

PS C:> sudo cmd

弹出 UAC,之后出现的窗口中有管理员字样。

87c67d0d7f4f843d0aa35ab1c9c567fc.png

OK,收工。

参考资料:
MSDN:Start-Process
吕毅的博客中关于UAC的一些文章:
应用程序清单 Manifest 中各种 UAC 权限级别的含义和效果
Windows 中的 UAC 用户账户控制
在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限)
Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
本文由本人首发于搞个Windows的sudo(伪) | Fw[a]rd的记录,
以 CC BY SA NC 4.0 未本地化版本释出。在知乎仍然以这个协议释出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值