我正在撰寫一個配置腳本,它必須做一些需要 UAC 批準的事情,我希望理想地實作近似“$session = sudo -v”,這樣我就可以混合提升/非提升并且不需要用戶坐在螢屏前進行 15-30 分鐘的設定只是以防萬一需要再次批準。
理想情況下,我會盡量避免打開新的控制臺/終端視窗,因為這會丟失輸出并導致螢屏閃爍,這可能對我的某些用戶造成問題。
這表明我可能想要做的是使用憑據開始作業,以便我可以等待完成并檢索輸出。
所以現在我有兩個問題:
- 有沒有辦法在會話中存盤用戶的 UAC 同意,例如通過使用它來獲取我可以重用的憑據?
- 我可以使用什么 Start- 或 Invoke- 命令來運行具有不會將塊轉換為字串的高度的腳本塊?
我使用 ScriptBlock 的嘗試失敗了,因為需要多次轉義進入 ScriptBlock 構造的字串:
{ [System.Environment]::SetEnvironmentVariable("TEST", "OK", "Machine") }
當我嘗試將其傳遞給時,我失敗了Start-Process -verb runAs powershell -ArgumentList @('-NoLogo', '-NoProfile', '-Command', $ScriptBlock):
At line:1 char:46
[System.Environment]::SetEnvironmentVariable(TEST, OK, Machine)
~
Missing ')' in method call.
At line:1 char:46
[System.Environment]::SetEnvironmentVariable(TEST, OK, Machine)
~~~~
Unexpected token 'TEST' in expression or statement.
At line:1 char:50
[System.Environment]::SetEnvironmentVariable(TEST, OK, Machine)
~
Missing argument in parameter list.
At line:1 char:63
[System.Environment]::SetEnvironmentVariable(TEST, OK, Machine)
~
Unexpected token ')' in expression or statement.
CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
或者如果我嘗試使用System.Diagnostics.Process.
uj5u.com熱心網友回復:
不,遺憾的是,無法快取 UAC 確認。
- 可以想象——雖然我不認為這是值得的——你可以在你自己的 IPC 的后臺啟動一個單獨的提升會話,例如通過從檔案中讀取命令并將結果保存回不同的檔案,與前臺會議協調。
使用提升呼叫需要使用
Start-Process, with-Verb RunAs,并且Start-Process基本上只支持字串引數(一個行程命令列)。要傳遞給 PowerShell CLI(可能是位置隱含的)
-Command/-c引數的字串需要"字符。將作為被傳遞的命令的一部分保留為轉義為\"(有關解釋,請參見此答案);適用于您的電話:Start-Process -Verb RunAs powershell -ArgumentList @( '-NoLogo', '-NoProfile', '-Command', "`"$($ScriptBlock -replace '"', '\"')`"" )警告:雖然將傳遞引數單獨傳遞給
-ArgumentList,如上所述,在概念上可能更可取,但不幸的是,一個長期存在的錯誤使得將所有引數編碼在單個字串中更好- 請參閱此答案;該錯誤也是將-Command引數顯式包含在上面嵌入的(外部,未轉義)中的原因";雖然它通常可以在沒有它的情況下作業,但它可以防止多個空格的運行被折疊成一個空格,這在嵌入的字串文字中可能很重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478640.html
