以不同使用者身分執行 PowerShell 腳本並提升權限

以不同使用者身分執行 PowerShell 腳本並提升權限

我知道這看起來像是一個重複的問題,但我已經嘗試過這些解決方案,但它們對我來說不起作用。

我們需要使用我們的網域帳戶運行腳本,但也要提升執行它的權限。這在大多數設備上都不是問題,因為快捷方式以管理員身份運行並提示我們輸入憑證。但是,如果使用者是本機管理員,則不會提示我們輸入憑證(只是提示是/否 UAC)。

我很困惑為什麼這不起作用:

# Get identity of script user
$identity = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()

# Elevate the script if not already
if ($identity.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host -F Green 'ELEVATED'
} else {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Exit
}

# Ensure the script has domain privileges
if ($identity.IsInRole('[domain]\[admin group]')) {
    Write-Host -F Green 'DOMAIN ADMIN'
} else {
    Start-Process PowerShell -Verb RunAsUser "-NoProfile -ExecutionPolicy Bypass -Command `"& '$PSCommandPath'`""
    Pause # required, otherwise the Exit below closes the UAC prompt
    Exit
}
Pause

當自提升腳本在輸入使用者和網域憑證時運行時,它會失去提升...即,當Start-Process -Verb RunAsUser powershell從提升的 PowerShell 運行時,它本身不會提升。

我還嘗試了以下方法:

Start-Process powershell -verb RunAs -argumentlist "Start-Process powershell.exe -Verb RunAsUser `"& path\to\script.ps1`""

這會失敗,因為網域管理員無權存取腳本目錄......除非他們被提升。

答案1

您是否正在自動化某些操作或只是偶爾運行腳本?腳本目錄是本地的還是網路上的?

正如您所注意到的,啟動 powershell 的新實例不會runas更改用戶,也runasuser不會提升進程。您需要以相反的順序執行這兩個操作。如果您以本機管理員身分登入,請使用 RunAsUser 啟動 Powershell,或透過以下方式啟動:

  • Shift+右鍵 > 以不同使用者身分執行 > 網域管理員

然後執行 runas 從那裡提升(作為網域管理員):

Start-Process PowerShell -Verb RunAs

您可以使用 來檢查您目前正在執行的使用者whoami。結果應該是您的網域帳戶,即使已提升。

或者

如果您正在遠端管理 PC 並已使用 powershell,請改用 powershell 進行連接,因為會話始終會提升:

Enter-PSSession MyPCName -credential (get-credential -username domain\MyAdmin)
# remote session:
[MyPCName]: PS C:\WINDOWS\system32>

我還建議盡可能不要使用本機管理員帳戶。

答案2

另一個工具是免費的 sysinternals 工具 執行程式

該指令如下圖所示:

psexec -u domain\user -h -i command [arguments]

參數為:

  • -i:運行程序,使其與遠端系統上指定會話的桌面進行互動。如果未指定會話,則進程在控制台會話中執行。
  • -h:如果目標系統是 Vista 或更高版本,則使用帳戶的提升令牌(如果可用)執行進程。

指定密碼也是一種不安全的做法:

-p:指定使用者名稱的可選密碼。如果您忽略此項,系統將提示您輸入隱藏密碼。

答案3

一個簡單的解決方案是先從需要網域憑證的位置複製腳本您已登入到您需要從提升的電腦的本機檔案系統。然後執行從該本機副本提升的腳本。

執行方式Start-Process Powershell與執行它的方式略有不同,因為它在運行提升時也採取腳本邏輯的操作。添加ExecutionPolicy Bypass -NoProfile -File參數並運行腳本以使其正常工作。

筆記:下面的兩個範例 PowerShell 解決方案都使用C:\本機檔案系統的「C」磁碟機的根目錄,但您可以相應地進行調整以適應。

PowerShell(解決方案 1)

Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

如果您需要使用網域憑證進行驗證才能存取腳本路徑位置最初您可以使用invoke-command-credential參數來執行複製操作。然後您可以執行以這種方式提升的本機檔案系統複製腳本。

PowerShell(解決方案 2)

$cred = Get-Credential "domain\username";
Invoke-Command -ScriptBlock {
    Copy-Item "path\to\script.ps1" -Destination "C:\" -Force;
    } -Credential $cred;

Start-Process Powershell -Argumentlist '-ExecutionPolicy Bypass -NoProfile -File "C:\script.ps1"' -Verb RunAs;

支持資源

答案4

據我了解,一般情況下,目前進程的執行使用者和權限在進程執行過程中是不能改變的,而是由作業系統核心在進程啟動時設定的。
因此,您應該將要以提升的方式運行的程式碼區塊分開,並使用 RunAs (或其變體)運行它。
如果可以更改進程內的權限,這將成為作業系統非常危險的安全漏洞。

另外,也分別定義了本地權限( local administrator)和網域權限( )。 如果您想同時允許AND ,則必須同時執行下列兩項操作:[domain]\[admin group]
DomainA\User01local administratorDomainA\AdminGroup

  • 授予DomainA\User01本機電腦安全群組local administrator,並且
  • 授予DomainA\User01網域安全性群組DomainA\AdminGroup

然後使用 RunAs 執行腳本。

相關內容