PowerShellスクリプトを別のユーザーとして実行し、昇格する

PowerShellスクリプトを別のユーザーとして実行し、昇格する

重複した質問のように見えますが、解決策を試してみましたが、うまくいきませんでした。

ドメイン アカウントでスクリプトを実行する必要がありますが、管理者権限で実行する必要があります。ショートカットは管理者として実行され、資格情報の入力が求められるため、ほとんどのデバイスではこれは問題になりません。ただし、ユーザーがローカル管理者の場合、資格情報の入力は求められません (UAC の yes/no プロンプトのみ)。

なぜこれが機能しないのかわかりません。

# 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

コマンドは次のようになります。

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

パラメータは次のとおりです。

  • -i: プログラムを実行して、リモート システム上の指定されたセッションのデスクトップと対話します。セッションが指定されていない場合は、プロセスはコンソール セッションで実行されます。
  • -h: ターゲット システムが Vista 以降の場合、アカウントの昇格されたトークン (使用可能な場合) を使用してプロセスを実行します。

パスワードを指定することも安全ではない方法です。

-p: ユーザー名のオプションのパスワードを指定します。これを省略すると、非表示のパスワードを入力するように求められます。

答え3

簡単な解決策は、まずドメイン資格情報を必要とする場所からスクリプトをコピーすることです。すでにログインしている昇格された状態で実行する必要があるマシンのローカル ファイル システムに移動します。次に、代わりにそのローカル コピーから昇格された状態でスクリプトを実行します。

Start-Process Powershell管理者特権で実行中にスクリプト ロジックのアクションを実行するには、実行時とは少し異なる方法で実行します。ExecutionPolicy Bypass -NoProfile -Fileパラメータを追加して、その後スクリプトを実行すると、スクリプトが機能します。

注記:C:\以下の PowerShell ソリューションの例は両方とも、ローカル ファイル システムの「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)とドメイン権限([domain]\[admin group])が別々に定義されています。と の両方
を許可する場合は、両方を実行する必要があります。DomainA\User01local administratorDomainA\AdminGroup

  • DomainA\User01ローカルコンピュータセキュリティグループに許可しlocal administrator
  • DomainA\User01ドメインセキュリティグループへの付与DomainA\AdminGroup

次に、RunAs を使用してスクリプトを実行します。

関連情報