昇格を必要とする PowerShell 関数を定義するにはどうすればよいでしょうか?

昇格を必要とする PowerShell 関数を定義するにはどうすればよいでしょうか?

Linuxに代わるものが見つからないのでsudo標高コマンドに関して、次の質問があります:

昇格を必要とする PowerShell 関数を定義するにはどうすればいいでしょうか? つまり、UAC プロンプトです。

たとえば、次のような関数があります。

function system-check {
    SFC /ScanNow
}

システム:

Windows 8.1 Pro 64ビット

パワーシェル:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      0      10586  117

編集1:

100%理解しやすいように言い換えましょう:

  1. PowerShellをユーザーとして実行する
  2. 前述の機能を実行するsystem-check
  3. コマンドを実行できるように関数を昇格させたいのですが、UACプロンプトが表示されるようにしたいことに注意してください。

答え1

管理者特権のウィンドウから特定のコマンドを実行するには:

Start-Process -FilePath powershell.exe -ArgumentList {$ScriptBlock} -verb RunAs

例えば:

Start-Process -FilePath powershell.exe -ArgumentList {
    SFC /scannow
} -verb RunAs

管理者特権のウィンドウから特定のスクリプトを実行するには:

Start-Process powershell -ArgumentList '-noprofile -file MyScript.ps1' -verb RunAs

UAC のプロンプトを表示して PowerShell セッション全体を実行するには:

Start-Process powershell.exe -Verb runAs

現在のウィンドウが昇格された権限で実行されている場合に $True または $False を返す関数:

function isadmin
 {
 #Returns true/false
   ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
 }

スクリプトが管理者としてのみ実行されるようにするには、先頭に以下を追加します。

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
 {
  Echo "This script needs to be run As Admin"
  Break
 }

PowerShell v4.0 では、#Requires ステートメントを使用することで上記を簡略化できます。

#Requires -RunAsAdministrator

ソース:権限を昇格して実行する

関連情報