使用“runas.exe”似乎不能像 PowerShell sudo 那样工作

使用“runas.exe”似乎不能像 PowerShell sudo 那样工作

我试图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 命令。

相关内容