CMDが管理者として実行されているか、昇格された特権を持っているかどうかを検出するにはどうすればよいですか?


101

バッチファイル内から、管理者特権または昇格された特権で実行しているかどうかをテストしたいと思います。

「管理者として実行」を選択してもユーザー名は変更されないため、機能しません。

効果はないが管理者特権を必要とする普遍的に利用可能なコマンドがある場合、特権をテストするためにそれを実行してエラーコードをチェックすることができます。これまでのところ、そのようなコマンドは見つかりませんでした。私が見つけたコマンドは、何かを示す可能性がある単一の非特定のエラーコードを返しているようで、さまざまな理由で失敗する傾向があります。

私はWindows 7だけを気にしますが、以前のオペレーティングシステムのサポートは素晴らしいでしょう。


1つのハックはecho > somefile、管理者特権を必要とするディレクトリへのアクセスを試みることです。副作用としてファイルを生成しますが、衝突をチェックし、回避策として一意のファイル名を作成できます。
マークB


1
:[1] [1] [あなたはここに自己昇降バッチを見つけることができます] stackoverflow.com/questions/4051883/...
アムル・アリ


1
@npocmakaあなたがリンクした質問は実際にはこれの複製です;)(2013 vs 2011)
Matthieu

回答:


62

補遺:Windows 8の場合、これは機能しません。代わりにこの優れた答えをご覧ください。


このソリューションはここにあります:http : //www.robvanderwoude.com/clevertricks.php

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

それが機能しないと仮定し、Win7について話しているので、適切であれば、Powershellで以下を使用できます。

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

そうでない場合(おそらく、バッチファイルを明示的に提案しているため、おそらくそうではありません)、上記を.NETで記述し、使用するバッチファイルの結果に基づいて、exeから終了コードを返すことができます。


4
ATコマンドは完璧です。あなたのグーグルフーは私のグーグルフーよりも優れています。;-)
ジェフ

2
+1 @Rushyo、私が最初に出くわしたので、あなたのソリューションを少し拡張してここに投稿しました。ありがとう! stackoverflow.com/questions/4051883/...
blak3r

16
ATWindows 8では動作しませんが、より良い解決策を見つけました。私はそれを別の質問への回答として投稿しました。ここでは、stackoverflow.com / questions / 4051883 / です。
mythofechelon

4
whoami / groupsをお勧めします| findstr / b BUILTIN \ Admin | findstr / c: "有効なグループ" && echo "管理者がいます!" -95、98、2000、XP、Vista、7、8で動作します!(コメント「私はRushyoのAT使用の提案が好きです...」)
barwnikk

1
私はping欠落を置き換えるのが好きですsleep:)
Matthieu

96

このトリックで必要なコマンドは1つだけnet sessionです。コマンドプロンプトに入力します。

あなたがいる場合は管理者でない、あなたはアクセスがメッセージを拒否され得ます。

System error 5 has occurred.

Access is denied.

あなたが管理者である場合は、別のメッセージが表示されますが、最も一般的なものは次のとおりです。

There are no entries in the list.

MS Technetから:

パラメータなしで使用すると、net sessionはローカルコンピュータとのすべてのセッションに関する情報を表示します。


これは、ATコマンドを使用したRushyoの回答と機能的に同じです。
ジェフ

12
Windows 8.1では、ATは非推奨であるため、これはATよりも推奨されます。Rushyoの答えを使用しますが、ATnetセッションまたはnet.exeセッションで置き換えると、私にとっては完全に機能します。
kayleeFrye_onDeck 2014

これは、コマンドプロンプトでこれを行う最も簡単な方法のようです(ただし、バッチファイルとは異なります)。
エンダーランド

2
There are no entries in the list.Windows 10 Proで印刷するだけ
gman

1
:バッチファイルを使用しているようなものnet session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

RushyoのAT使用の提案は気に入っていますが、これは別のオプションです。

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

このアプローチでは、必要に応じて、非管理者と昇格していない管理者を区別することもできます。昇格していない管理者は、グループリストにまだBUILTIN \ Administratorsがありますが、有効になっていません。

ただし、これは一部の英語以外の言語システムでは機能しません。代わりに、試してください

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(これはWindows 7で動作するはずですが、以前のバージョンについてはわかりません。)


1
ポーランド語バージョンでは、BUILTIN \ Administratorzyがあるので、お勧めします。whoami/ groups | findstr / b BUILTIN \ Admin | findstr / c: "有効なグループ" && goto:isadministrator
barwnikk

@barwnikk、私は推奨whoami/groupsし、手動でラインをスキャンします。時間がかかりすぎず、コマンドはあなたの脳に収まります。
ペーチェリエ2015

@Pacerier:問題のポイントは、バッチファイルで標高を検出することです。ユーザーがコマンドラインにいる場合、必要なのはウィンドウのタイトルを確認することだけです。これは、昇格した場合は常に "Administrator:"から始まります。
Harry Johnston

@HarryJohnston、ワウはそれを認識していませんでした。「管理者」のタイトルはすべてのバージョンのウィンドウに表示されますか?
Pacerier 2015

@Pacerier:現在のすべてのバージョン(Vista以降)。
ハリージョンストン

24

他の人が以前に配置したものとほぼ同じですが、バッチコマンドの最初に配置できる1つのライナーとして。(まあ、通常@echoオフの後で。)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

2
これは最新バージョンであり、net.exeからの無関係な出力を適切に非表示にします
andersand

2
Windows 10で正常に動作します
James Pack

&タイムアウト/ t 10&終了/ b 1)の最後を微調整しただけで、バッチファイルでウィンドウがすぐに消えないようになりました。
WhoIsRich

12

Vista、Win 7以降でこれを行う最も簡単な方法は、トークングループを列挙し、現在の整合性レベル(またはグループのメンバーシップのみが重要な場合は管理者のsid)を探すことです。

管理者特権で実行しているかどうかを確認します。

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

ローカル管理者に属しているかどうかを確認します。

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

ドメイン管理者に属しているかどうかを確認します。

whoami /groups | find "-512 " && Echo I am a domain admin

次の記事は、Windowsが使用する整合性レベルのSIDの一覧です。http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groupsには、間違った情報を取得するという極端なケースがあります。stackoverflow.com/questions/4051883/を
zumalifeguard

7

これは、昇格したステータスに焦点を当てたハリーの回答のわずかな変更です。install.batファイルの先頭でこれを使用しています:

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

これは間違いなく私にとってはうまくいき、原則はしっかりしているようです。MSFTのクリス・ジャクソン

昇格を実行している場合、トークンにはMandatory Label \ High Mandatory LevelというACEが含まれています。


whoami / groupsには、間違った情報を取得するという極端なケースがあります。stackoverflow.com/questions/4051883/…を
zumalifeguard

7

ソリューション:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

Windows 10では機能しません

Windowsのすべてのバージョンでそうすることができます:

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

6

私は多くの(ほとんど?)応答を読み、Win 8.1で動作するbatファイルを開発しました。共有したいと思いました。

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

誰かがこれが便利だと思うことを願っています:)


whoami / groupsには、間違った情報を取得するという極端なケースがあります。stackoverflow.com/questions/4051883/を
zumalifeguard

これありがとう!他の「whoami」ソリューションは、Windows 8.1では機能しませんでした。これはしました。
ライアン、


1

私は本当にこのパーティーに遅れていることを知っていますが、これは管理者のフードを決定するための私の1つのライナーです。

エラーレベルには依存せず、単に次のようにしsysteminfoます。

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

ユーザーの管理ステータスに応じて、yesまたはnoを返します...

また、変数「admin」の値を「yes」または「no」に設定します。


これは、ユーザーがAdministratorsローカルグループの直接のメンバーである場合にのみ機能します。ユーザーが管理者グループのメンバーであるドメイングループ(「ドメイン管理者」など)のメンバーである場合、ユーザーは機能しません。
ハリージョンストン

1

管理者権限を持つユーザーとして実行している場合、環境変数SessionNameは定義されず、バッチファイルを実行するときにも管理者権限がありません。

「net session」コマンドを使用して、エラー戻りコード「0」を探し、管理者権限を確認する必要があります。

例; -最初のエコーステートメントはベルキャラクターです net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)


0

以下は、Windows 7からWindows 10で使用した簡単な方法です。基本的には、「IF EXIST」コマンドを使用して、Windows \ System32 \ WDI \ LogFilesフォルダーを確認します。WDIフォルダーは、少なくとも7以降のWindowsのすべてのインストールに存在し、アクセスするには管理者権限が必要です。WDIフォルダーには常にLogFilesフォルダーが含まれています。したがって、WDI \ LogFilesフォルダーで「IF EXIST」を実行すると、管理者として実行されている場合はtrueが返され、管理者として実行されていない場合はfalseが返されます。これをバッチファイルで使用して特権レベルを確認し、その結果に基づいて必要なコマンドに分岐できます。

これがサンプルコードの短いスニペットです:

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

この方法は、デフォルトのセキュリティ権限がWDIフォルダで変更されていないことを前提としていることに注意してください(ほとんどの状況では起こりそうにありませんが、以下の警告#2を参照してください)。その場合でも、管理者アクセスを必要とする別の一般的なファイル/フォルダーをチェックするようにコードを変更するだけの問題です(System32 \ config \ SAMは代替候補として適切かもしれません)。または、そのための独自のファイルを作成することもできます目的。

ただし、この方法には2つの注意点があります。

  1. UACを無効にすると、すべてがとにかく管理者として実行されるという単純な事実を打破する可能性があります。

  2. WindowsエクスプローラーでWDIフォルダーを開き、プロンプトが表示されたら[続行]をクリックすると、そのユーザーアカウントに永続的なアクセス権が追加され、メソッドが壊れます。これが発生した場合は、WDIフォルダーのセキュリティ権限からユーザーアカウントを削除することで修正できます。何らかの理由でユーザーがWindowsエクスプローラーでWDIフォルダーにアクセスできる必要がある場合は、コードを変更して別のフォルダーを確認する必要があります(上記のように、この目的のために独自のフォルダーを作成することをお勧めします)。 。

だから、確かに私の方法は壊れる可能性があるため完璧ではありませんが、実装が簡単で、Windows 7、8、10のすべてのバージョンと同等の互換性がある比較的速い方法です。 100%効果的でした。


0

Win7 EnterpriseおよびWin10 Enterpriseに対応

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.