PowerShell を起動してコマンドを実行し、新しいプロセスに変数を渡すにはどうすればよいですか?

PowerShell を起動してコマンドを実行し、新しいプロセスに変数を渡すにはどうすればよいですか?

現在、Windows 10 20H2 OS へのすべてのハックを 1 回の実行で実行するスクリプトを作成中です。

PowerShell 7.0.4 x64 を使用しており、スクリプトを管理者で実行したいのです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方法がわかりません。$TiSvcpwsh

$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上記のエラーは生成されません。

関連情報