PowerShellスクリプトで、管理者権限で実行しているかどうかを確認するにはどうすればよいですか?


回答:


34
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
$currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

コマンドラインの安全上の秘 fromから)


2
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity] :: GetCurrent())&{if($ currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] :: Administrator)){(get- host).UI.RawUI.Backgroundcolor = "DarkRed" clear-host write-host "警告:PowerShellは管理者として実行されています
。`n

最初の行:最後の閉じ中括弧)がありません。6文字未満の変更であるため、修正できません。
ザビエルニコレット

57

PowerShellの4.0では、あなたは使用することができる必要があり、あなたのスクリプトの先頭に:

#Requires -RunAsAdministrator

出力:

スクリプト「MyScript.ps1」は、管理者として実行するための「#requires」ステートメントが含まれているため、実行できません。現在のWindows PowerShellセッションは管理者として実行されていません。[管理者として実行]オプションを使用してWindows PowerShellを起動し、スクリプトを再度実行してください。


まさに私が探していたものではありませんが、それでも非常に便利です。エディありがとう!
マイケルケリー

33
function Test-Administrator  
{  
    $user = [Security.Principal.WindowsIdentity]::GetCurrent();
    (New-Object Security.Principal.WindowsPrincipal $user).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)  
}

上記の機能を実行します。結果がTrueの場合、ユーザーは管理者権限を持っています。


4
これは、スクリプトを実行しているユーザーがマシンの管理者であるかどうかを判断するだけで、現在スクリプトが管理者権限実行されているかどうかは判断しません。つまり、ユーザーが「管理者として実行」を使用してコマンドシェルを起動しなかった場合でも、これは引き続きtrueを返します。
ホリスティック開発者14年

2
@HolisticDeveloper、それは間違っています。あなたが上昇していない場合は、falseを返します
charleswj81

@ charleswj81現在、私はHolistic Developerが説明する動作を観察しています。
zneak

私はあなたがセミコロンを必要とは思わない...しかしそれは私がそれがエラーを投げるとは思わないと言った
Kolob Canyon

これは、2018年の時点でWin10で機能します。現在のユーザーアカウントが昇格されていない場合はFalseを返し、Powershellが昇格されている場合はTrueを返します。
アルバーグ

0

これにより、管理者であるかどうかが確認され、そうでない場合はPowerShell ISEで管理者として再度開きます。

お役に立てれば!

    $ver = $host | select version
    if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}

    # Verify that user running script is an administrator
    $IsAdmin=[Security.Principal.WindowsIdentity]::GetCurrent()
    If ((New-Object Security.Principal.WindowsPrincipal $IsAdmin).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator) -eq $FALSE)
    {
      "`nERROR: You are NOT a local administrator.  Run this script after logging on with a local administrator account."
        # We are not running "as Administrator" - so relaunch as administrator

        # Create a new process object that starts PowerShell
        $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell_ise";

        # Specify the current script path and name as a parameter
        $newProcess.Arguments = $myInvocation.MyCommand.Definition;

        # Indicate that the process should be elevated
        $newProcess.Verb = "runas";

        # Start the new process
        [System.Diagnostics.Process]::Start($newProcess);

        # Exit from the current, unelevated, process
        exit
    }

0

上記の回答の組み合わせとして、スクリプトの冒頭で次のようなものを使用できます。

# todo: put this in a dedicated file for reuse and dot-source the file
function Test-Administrator  
{  
    [OutputType([bool])]
    param()
    process {
        [Security.Principal.WindowsPrincipal]$user = [Security.Principal.WindowsIdentity]::GetCurrent();
        return $user.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator);
    }
}

if(-not (Test-Administrator))
{
    # TODO: define proper exit codes for the given errors 
    Write-Error "This script must be executed as Administrator.";
    exit 1;
}

$ErrorActionPreference = "Stop";

# do something

もう1つの方法は、この行でスクリプトを開始することです。これにより、管理者権限で開始されていない場合にスクリプトが実行されなくなります。

#Requires -RunAsAdministrator

1
残念ながら、これは機能しません。スクリプトが昇格された権限で実行されていない場合、ロードすらされず、カスタムエラーメッセージは表示されません。
JamesQMurphy

ありがとう。上記の答えを修正しました。
MovGP0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.