管理者として PowerShell スクリプトを実行する

Marion Paul Kenneth Mendoza 2023年1月30日
  1. Start-Process コマンドレットを使用して PowerShell スクリプトを管理者として実行する
  2. 管理者として引数を指定して PowerShell スクリプトを実行する
  3. 作業ディレクトリを保持しながら、管理者として PowerShell スクリプトを実行する
管理者として PowerShell スクリプトを実行する

作成して実行するほとんどのスクリプトにはアクセス許可が必要であり、管理者は管理者が昇格した PowerShell プロンプトからスクリプトを実行することになります。PowerShell では、管理者権限で Windows PowerShell を実行し、管理者の資格情報を入力することで、アクセス許可を昇格させます。

ただし、管理者の資格情報を入力せずに、特定の状況でスクリプトをシームレスに実行する必要がある場合があります。したがって、スクリプトの最初にさまざまな自己昇格コマンドを統合できます。この記事ではその方法を説明します。

Start-Process コマンドレットを使用して PowerShell スクリプトを管理者として実行する

Start-Process コマンドレットは、1つ以上のプロセス、実行可能ファイルまたはスクリプトファイル、またはインストールされたソフトウェアが Windows PowerShell を含むローカルコンピューターで開くことができる任意のファイルを開始します。

このコマンドレットと一連のパラメーターを使用して、管理者として Windows PowerShell を実行できます。

この例では、Hello_World.ps1 スクリプトを作成しました。このスクリプトは、コンソール内に単純な Hello World 文字列を出力します。

Hello_World.ps1

Write-Output 'Hello World!'

上記の PowerShell ファイルを例として使用して、管理者権限でスクリプトを実行しているかどうかを確認および確認できます。まず、以下のスニペットコードを実行します。

ローカルコンピューターのユーザーアカウント制御(UAC)により、Windows PowerShell は引き続き確認を求める必要がある場合があります。セキュリティ上の理由から、UAC を完全に無効にすることはお勧めしません。
Start-Process powershell -verb RunAs -ArgumentList ".\Hello_World.ps1"

上記のスクリプトを実行すると、管理者権限を持つ Windows PowerShell の新しいインスタンスが生成されます。上記で実行したスクリプトの唯一の注意点は、PowerShell ファイルに引数を渡す必要がある場合、新しく生成された管理コンソールに引数を引き継がないことです。

管理者として引数を指定して PowerShell スクリプトを実行する

この例では、前のワンライナースクリプトを使用して、複数の条件ステートメント内でスクリプトを修正できます。

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $Command = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Command
        Exit
 }
}

# Place your script here
Write-Output 'Hello World!'

以前は、別のファイルを呼び出して PowerShell スクリプトを実行していましたが、この例では、スクリプト(Hello_World.ps1 など)をこのスニペットの下に配置するだけです。

スニペットの仕組みは次のとおりです。

  • 最初の if ステートメントは、実行されたスクリプトが管理者権限を持つ Windows PowerShell で既に実行されているかどうかを確認します。
  • 2 番目の if ステートメントは、Windows オペレーティングシステムのビルド番号が 6000 以上であるかどうかを確認します。(Windows Vista または Windows Server 2008 以降)
  • $Command 変数は、引数を含め、スクリプトの実行に使用されるコマンドを取得して保存します。
  • Start-Process は、昇格された特権で Windows PowerShell の新しいインスタンスを起動し、前のスクリプトと同じようにスクリプトを再実行します。

作業ディレクトリを保持しながら、管理者として PowerShell スクリプトを実行する

特定の状況に備えて、スクリプトの作業ディレクトリを保持する必要がある場合があります。したがって、作業ディレクトリを維持する自己昇格スニペットは次のとおりです。

if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}
# Place your script here
Write-Output 'Hello World!'

このスニペットでは、スクリプトが実行された場所の作業ディレクトリを保持するために、Start-Process コマンドレット内の引数の 1つとして $PSCommandPath を渡しました。

パス相対操作を実行するには、作業ディレクトリを保持することが不可欠です。残念ながら、前に示した前の 2つのスニペットはパスを維持しないため、予期しないエラーが発生する可能性があります。したがって、上記の改訂された構文を使用できます。

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn