我有一個 PowerShell 設定,我想在可能執行策略受到限制并且需要管理員權限的計算機上執行它。
理想情況下,我可以將它包裝在一個 cmd 批處理中,如下所示:
powershell -Command "Start-Process powershell -Verb runAs -ArgumentList '-noexit','-ExecutionPolicy','bypass','-File','C:\path\setup.ps1'"
問題是當包含空格時我無法使其作業,并且如果是相對路徑(帶有)C:\path\setup.ps1,路徑也不起作用。
有什么幫助嗎?cd C:\path
uj5u.com熱心網友回復:
雖然將傳遞引數單獨傳遞給
Start-Processcmdlet 的-ArgumentList引數在概念上可能更可取,但不幸的是,一個長期存在的錯誤使得將所有引數編碼在單個字串中更好- 請參閱此答案。-Verb RunAs用于啟動具有提升的命令(以管理員身份),總是使用SYSTEM32 目錄作為作業目錄 - 即使是-WorkingDirectory引數,如果存在,也會被悄悄地忽略。因此,為了設定自定義作業目錄并呼叫 ,-Command必須使用 CLI 引數,并且Set-Location(cd) 呼叫必須在呼叫相對路徑指定的腳本之前。cmd.exe通過powershell.exeWindows PowerShell CLI執行所有這些操作會使事情變得復雜,因為需要轉義。
應用于您的powershell.exeCLI 呼叫(假設 dir.C:\path 1和 script file setup 1.ps1):
powershell -Command "Start-Process -Verb RunAs powershell '-NoExit -ExecutionPolicy Bypass -Command "^"" cd \\"^""C:\path 1\\"^""; & \\"^"".\setup 1.ps1\\"^"" "^""'"
筆記:
From
cmd.exe,"^""(sic) 是將"嵌入在整個"..."字串中的內容傳遞到powershell.exe(從無殼背景關系,例如計劃任務,使用"""或更簡單地說,\".為簡單起見,對于雙重嵌套的
"字符。上面使用了\-escaping 技術,帶有\字符。自己需要轉義為\\.
注意:從 PowerShell CLI 的角度來看 - 包括在 PowerShell (Core) 7 中(見下文) -\" 總是有效,但它的使用是有問題的cmd.exe,它不能理解\"為轉義 "字符。因此將其視為常規字串定界符,這可能會導致它誤解\"...\"作為未參考字串的一部分的內容,其中元字符(例如)&可能會破壞命令,因為它們是由cmd.exe自身預先解釋的;例如,powershell -c " \"Abbot & Costello\" "break from cmd.exe,需要^&代替,"或者,如上所示,轉義嵌入"為"^"":
powershell -c " "^""Abbot & Costello"^"" "
當您pwsh.exe改為呼叫 PowerShell (Core) 7 CLI時,可以進行兩種簡化:
此外
\",pwsh.exe更簡單地支持""嵌入"字符。在"..."字串中;后者從cmd.exepwsh.exe現在有一個單獨的-WorkingDirectory引數,因此允許使用該-File引數呼叫腳本 - 但是請注意,檔案路徑在設定作業目錄之前已決議,因此下面使用完整路徑。
pwsh.exe -Command "Start-Process -Verb RunAs pwsh.exe '-NoExit -ExecutionPolicy Bypass -WorkingDirectory ""C:\path 1"" -File ""C:\path 1\setup 1.ps1""'"
uj5u.com熱心網友回復:
在這里,您有一個腳本示例,該示例檢查行程是否正在運行提升,如果不是,它會嘗試啟動一個提升的新行程。在這種情況下不需要嵌套檔案或使用 CMD。
這顯然伴隨著 UAC 提示的警告,就像任何其他以提升的權限啟動的行程一樣。
$isAdmin = [System.Security.Principal.WindowsPrincipal]::new(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole('Administrators')
if(-not $isAdmin)
{
$params = @{
FilePath = 'powershell' # or pwsh if Core
Verb = 'RunAs'
ArgumentList = @(
"-NoExit"
"-ExecutionPolicy ByPass"
"-File `"$PSCommandPath`""
)
}
Start-Process @params
Exit
}
"I'm elevated"
# Code goes here
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/414559.html
標籤:
上一篇:無法連接到Azure檔案共享
