PowerShellが管理者として実行されているかどうかを検出する


36

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

保護されたポートを開く機能を必要とするプログラムを実行しようとしているため、知る必要があります。


1
で説明するように昇格権限を考慮マットのPowerShellで管理者権限を獲得答え
MiFreidgeim SO-停止ビーイングの悪を

回答:


42
[bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).groups -match "S-1-5-32-544")

これが何をするかを分解する:

  • [bool]-最終結果をにキャストしboolます。
  • [System.Security.Principal.WindowsIdentity]::GetCurrent()- WindowsIdentity現在実行中のユーザーのを取得します。
  • (...).groups-IDのgroupsプロパティにアクセスして、IDがメンバーであるユーザーグループを確認します。
  • -match "S-1-5-32-544"かどうかを確認するためにgroups含まれている既知のSIDのAdministratorsグループのを「管理者として実行」を使用した場合、アイデンティティはそれだけが含まれます。

2
コードを1行だけ投稿する代わりに、その機能を説明してください。これは、将来の訪問者が必要に応じて理解し、適応させるのに役立ちます。
slhck

ブー この男性にさらに賛成票を投じる
コロブキャニオン

4
以下の@Bill_Stewartの答えは、魔法の文字列がないため好まれます。
8DH

-matchタイプキャスティングを使用する代わりに:[Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544'
TheIncorrigible1

57
([Security.Principal.WindowsPrincipal] `
  [Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

これにより、現在のWindows IDが取得され、現在のIDに管理者の役割がある(つまり、昇格されている場合)Trueが返されます。


13
受け入れられた答えは正しいですが、この答えは、特に6か月後にスクリプトを読む可能性のある人にとっては、より明確です。
パトリックシーモア

46

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

#Requires -RunAsAdministrator

出力:

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


管理者によって実行されていない場合に終了する機能が必要な場合はどうなりますか?
コロブキャニオン

1
@KolobCanyon- 昇格されたPowerShell関数のみを実行するようなことはありません。PowerShellプロセス全体が昇格するかどうか。
-Bill_Stewart

@Bill_Stewartはい、しかしreturnユーザーが管理者でない場合は可能です:)
Kolob Canyon

1
@KolobCanyon-PowerShell プロセスのみを昇格できます。単一の関数を昇格させることはできません。これ#Requires -RunAsAdministratorが便利な理由です。昇格していない場合、スクリプト全体が実行されないようにします。
-Bill_Stewart

@Bill_Stewartええ、私はいつかそれを使わなければなりません。
コロブキャニオン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.