如何啟動PowerShell來執行命令並將變數傳遞給新進程?

如何啟動PowerShell來執行命令並將變數傳遞給新進程?

我目前正在編寫一個腳本,該腳本可以在一次運行中完成 Windows 10 20H2 作業系統的所有修改。

我正在使用 PowerShell 7.0.4 x64,我想在 Admin 中運行腳本pwsh,我發現一些註冊表項需要更改 TrustedInstaller 權限,我找到了一個解決方案:使用psexec -S啟動pwsh進程來運行具有權限的命令TrustedInstaller,不幸的是我不知道如何將變數傳遞給新進程,並使其自動退出psexec以繼續腳本執行。

我將以此為例:

$TiSvc=@(
"PrintWorkflowUserSvc"
"RmSvc"
"SCardSvr"
"SecurityHealthService"
"Sense"
"SgrmBroker"
"wscsvc"
)
$TiSvc | %{Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$_" -Name Start -Type DWord -Value 4}

如果沒有TrustedInstaller特權,該命令將失敗並出現存取被拒絕錯誤。

現在,要解決這個問題,請使用psexec運行命令(我已將SysInternals資料夾放入path):

$PwSh=(Get-Process -Id $pid).path
PsExec -S $PwSh ???

我想在當前會話中設定[array]變量$TiSvc,我不知道如何傳遞$TiSvc到新pwsh會話並執行此命令:

$TiSvc | %{Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\$_" -Name Start -Type DWord -Value 4}

並且命令執行完畢後,退出新pwsh會話並退出psexec繼續腳本執行;

我怎樣才能做到這一點?任何幫助表示讚賞。

答案1

TrustedInstaller將您想要在文字檔案中執行的任何命令放入與腳本檔案相同的路徑中,確保PsExec.exe位於 中Path,然後使用以下命令:

$PwSh=(Get-Process -Id $pid).path
psexec -S $pwsh -file $psscriptroot\tiworker.txt

如果要在另一個進程中執行需要TrustedInstaller權限的命令PowerShell,則該進程將在執行完成後自動退出,從而允許主腳本繼續執行。


修正了導致 PowerShell 進程在沒有 TrustedInstaller 權限的情況下啟動的小錯誤。


上面的方法不知何故無法正常工作,當我嘗試執行這些命令時:

Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\WinDefend" -Name "Start" -Type DWord -Value 4
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\WdBoot" -Name "Start" -Type DWord -Value 4
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\WdFilter" -Name "Start" -Type DWord -Value 4
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\WdNisDrv" -Name "Start" -Type DWord -Value 4
Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\WdNisSvc" -Name "Start" -Type DWord -Value 4

我收到錯誤:

Set-ItemProperty: Attempted to perform an unauthorized operation.

如果我使用reg add

ERROR: Access is denied.

然而,他們之前的命令全部返回:

The operation completed successfully.

具體來說這些指令:

Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender" -Name "DisableAntiSpyware" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender" -Name "DisableRoutinelyTakingAction" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender" -Name "ProductStatus" -Type DWord -Value 0
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\Real-Time Protection" -Name "DisableAntiSpywareRealtimeProtection" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\Real-Time Protection" -Name "DisableRealtimeMonitoring" -Type DWord -Value 1
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\Scan" -Name "AutomaticallyCleanAfterScan" -Type DWord -Value 0
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\Scan" -Name "ScheduleDay" -Type DWord -Value 8
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\UX Configuration" -Name "AllowNonAdminFunctionality" -Type DWord -Value 0
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows Defender\UX Configuration" -Name "DisablePrivacyMode" -Type DWord -Value 1

當以管理員身份而不是 TrustedInstaller 運行時,每個都會傳回此錯誤:

Set-ItemProperty: Requested registry access is not allowed.

使用 運行時PsExec,不會產生此錯誤。

但是這個錯誤:

Set-ItemProperty: Attempted to perform an unauthorized operation.

還是會產生。

我想這是因為PsExec依賴遠端東西,我禁用了“遠端協助”,“遠端桌面”和“遠端註冊表”;

我使用過NSudoLC.exe,它成功禁用了 Windows Defender,沒有錯誤:

NSudoLC.exe -U:T -P:E $pwsh -file $home\desktop\tisvc.txt

使用NSudo這兩種方法時,不會產生上述錯誤。

相關內容