搞个Windows的sudo(伪)
今天折腾新装好的Windows,需要安装好多环境。包括Python、C/C++、MSYS。现在在Windows上写入C:\Program Files
需要管理员+UAC高令牌等级。如果是提供安装包的软件的话,直接双击,装着装着自然会叫你授予权限的。但是如果在命令行下面,像pip之类的软件就不会出现请求授权的弹窗而是直接告诉你失败了。一般Linux用户很少遇到这种情况(感谢polkit),万一遇到了直接输入fuck
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,之后出现的控制台窗口中带有管理员字样。OK,收工。
参考资料:
MSDN:
吕毅的博客中关于UAC的一些文章:
应用程序清单 Manifest 中各种 UAC 权限级别的含义和效果