我试图runas
在 PowerShell 函数中使用它来充当穷人的sudo
,但runas
似乎并没有真正授予我管理员访问权限。例如,我在运行时被拒绝访问:
runas /user:admin "cmd /K mkdir C:\Windows\System32\mydirectory"
另外,如果我打开 vim 并尝试将文件写入 System32,则保存时会出现错误:
runas /user:admin "C:\Program Files (x86)\Vim\vim74\gvim.exe C:\Windows\System32\mynewtextfile.txt"
我不认为这是凭据问题,因为我可以执行非管理员任务,例如将文件写入桌面,而且我的密码似乎可以正常工作。我在管理工具中的“计算机管理”工具中检查过,“admin”位于“管理员”组中。我遗漏了什么?我使用的是 Windows 7 Pro。
答案1
根据我在 Windows 10 中的调查,以下命令工作:
海拔:
saps -Verb RunAs "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory"
切换用户:
saps -Verb RunAsUser "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory"
以下命令不工作:
runas /user:admin "cmd /K mkdir C:\Windows\System32\mydirectory"
– 这不会导致权限提升saps -Credential admin "cmd" -Arg "/K mkdir C:\Windows\System32\mydirectory"
– 这不会导致权限提升New-Item -Credential admin "C:\Windows\System32\mydirectory"
– 除了 New-PSDrive cmdlet 之外,文件系统提供程序不支持其他凭据。
答案2
我在文档中找到了以下信息get-help -full start-process
:
# 以“以管理员身份运行”权限启动 PowerShell 进程。
PS C:>启动进程 powershell.exe -verb runas
我能说的最好的是,runas.exe
可以更改您的用户,但不会提升您的权限。但是,根据上述引述,powershell 的Start-Process
流程能习惯于这样做,所以我最终在我的sudo
函数中做了以下事情,这似乎运行得足够好:
$MY_PROFILE_TMP="$Env:TMP\my_profile_tmp";
Function Init-TMP() {
#Make sure my personal tmp directory exists
if (!(Test-Path $MY_PROFILE_TMP)) {
mkdir $MY_PROFILE_TMP | Out-Null
}
}
Function As-Admin() {
Init-TMP
#Create unique temp filenames to capture stderr and stdout
$GUID=New-Guid
$ADMIN_OUT="$MY_PROFILE_TMP\$($GUID)_OUT.txt"
$ADMIN_ERR="$MY_PROFILE_TMP\$($GUID)_ERR.txt"
#Remove temp files if for some anomoly or error they already exist
rm -ErrorAction Ignore $ADMIN_OUT
rm -ErrorAction Ignore $ADMIN_ERR
#Start powershell with elevated permissions and write to the tmp out and error files
#Without the &{}, invalid commands like `sudo dinosaur` don't get
#captured to the error file
Start-Process powershell "& { $args } 2>$ADMIN_ERR > $ADMIN_OUT" -Verb runas -Wait -WindowStyle Hidden
#Write to the current console the out and error results from the elevated process
#TODO ideally, we'd read from these as a stream so the order would be correct...
cat $ADMIN_ERR -Delimiter None | Write-Error
cat $ADMIN_OUT
#Remove the temp files
rm -ErrorAction Ignore $ADMIN_OUT
rm -ErrorAction Ignore $ADMIN_ERR
}
#Make an alias "sudo"
New-Alias -Name sudo -Value As-Admin
答案3
您是否已启用 UAC?如果已启用,您是否从提升权限的提示符运行 PowerShell 脚本?
runas 命令受其父命令窗口的 UAC 限制。如果您没有从提升的提示符中调用 runas 命令,则用户不会拥有提升的凭据,即使它是管理帐户。
不幸的是,UAC 就是这样工作的。唯一的区别是 CLI 应用程序(例如 runas)在需要时无法像 GUI 程序那样提示提升权限。在 *NIX 操作系统中没有与 sudo 命令等效的 Windows 命令。