web-dev-qa-db-ja.com

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

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

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

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

以前のオペレーティングシステムのサポートはいいかもしれませんが、私はWindows 7だけに関心があります。

85
Jeff

補遺: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から終了コードを返すことができます。

57
Rushyo

このトリックには、コマンドプロンプトに「net session」と入力するコマンドが1つだけ必要です。

あなたが管理者でない場合、アクセスが拒否されましたというメッセージが表示されます。

MS Technet から:

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

71
Ambrose Leung

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

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で動作するはずですが、以前のバージョンについてはわかりません。)

25
Harry Johnston

他の人が以前に置いたものとほぼ同じですが、バッチコマンドの先頭に置くことができる1つのライナーとして。 (まあ、通常は@echo offの後です。)

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

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が使用する整合性レベルの一覧です。 http://msdn.Microsoft.com/en-us/library/bb625963.aspx

10
Martin Binder

以下は、ステータスの上昇に焦点を当てたハリーの答えのわずかな修正です。私は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
)

これは間違いなく私にとってはうまくいき、原理は健全であるように思われます。 from MSFTのChris Jackson

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

7
Hugh

ソリューション:

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 )
7
ipAlex

応答の多く(ほとんど?)を読み、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

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

6
GeoffH

https://stackoverflow.com/a/38856823/2193477 の「1つではないライナー」バージョン

@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof

:not_admin
echo ERROR: Please run as a local administrator.
exit /b 1
2
tivnet

私はこのパーティーに本当に遅れていることを知っていますが、ここでは管理者の判断をするための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に設定します。

1
user1

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