web-dev-qa-db-ja.com

バッチスクリプト:管理者権限を確認する方法

現在のバッチスクリプトに管理者権限があるかどうかを確認する方法

自分自身をrunasで呼び出す方法は知っていますが、管理者権限を確認する方法はわかりません。私が見た唯一の解決策は、大雑把なハックの仕事か外部のプログラムを使うことです。 Windows XP以降で動作するのであれば、ハックジョブであるかどうかはあまり気にしません。

249
flacs

問題

blak3r / Rushyo の解決策は、Windows 8を除くすべてのシステムで問題なく機能します。Windows8でATname__を実行すると、次のようになります。

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(スクリーンショット1を参照)%errorLevel%1を返します。

研究

それで、私は昇格された許可を必要とする他のコマンドを探しに行きました。 rationallyparanoid.com いくつかのリストを持っていたので、私は両方でアクセスを拒否されるコマンドを見つけることを期待して現在のWindows OS(XPと8)の2つの反対の両極端でそれぞれのコマンドを実行しました標準の権限で実行した場合のOS.

結局、私はそれを見つけました - NET SESSION。含まれていない、クリーンで普遍的な解決策

  • 安全な場所でのデータの作成またはデータとのやり取り
  • FORname__ループから返されたデータの分析
  • "Administrator"の文字列を検索
  • ATname__(Windows 8非互換)またはWHOAMIname__(Windows XP非互換)の使用.

それぞれに独自のセキュリティ、使いやすさ、および移植性の問題があります。

テスト

私はこれがうまくいくことを独自に確認しました:

  • Windows XP、x86
  • Windows XP、x 64
  • Windows Vista、x86
  • Windows Vista、x 64
  • Windows 7、x86
  • Windows 7、x 64
  • Windows 8、x86
  • Windows 8、x 64

(スクリーンショット2を参照)

実装/使用方法

したがって、この解決策を使用するには、単に次のようにします。

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...

    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )

    pause >nul

あなたが怠け者なら、ここで利用可能です: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

説明

NET SESSION"サーバーコンピュータの接続を管理します。パラメータなしで使用され、ローカルコンピュータとのすべてのセッションに関する情報を表示します。" に使用される標準的なコマンドです。

だから、これは私の与えられた実装の基本的なプロセスです:

  1. @echo off
    • コマンドの表示を無効にする
  2. goto check_Permissions
    • :check_Permissionsコードブロックにジャンプ
  3. net session >nul 2>&1
    • 実行コマンド
    • でコマンドの視覚的な出力を隠す
      1. 標準出力(数値ハンドル1/STDOUTname__)ストリームをnulname__にリダイレクトする
      2. 標準エラー出力ストリーム(数値ハンドル2/STDERRname__)を数値ハンドル1と同じ宛先にリダイレクトする
  4. if %errorLevel% == 0
    • 終了コード(%errorLevel%の値が0である場合、これはエラーが発生していないことを意味します、したがって直前のコマンドが正常に実行された
  5. elsename __
    • 終了コード(%errorLevel%の値が0ではない場合、これはエラーが発生したことを意味します、したがって直前のコマンドの実行が失敗しましたが失敗しました
  6. それぞれの括弧の間のコードはどの基準が満たされるかに応じて実行されます

スクリーンショット

Windows 8 AT%errorLevel%

[imgur]

WindowsではNET SESSION XP x86 - Windows 8 x 64

[imgur]

あなたの受け入れられた答えを私のものに変えてくれてありがとう、@ Tilka。 :)

419
mythofechelon

Andersの解決策は私のために働いたが、私は(あなたが管理者ではなかったとき)反対を得るためにそれをどう反転させるかわからなかった。

これが私の解決策です。それは2つのケースIFとELSEケース、そして人々が実際にそれを読むことを確実にするためのいくつかのASCIIアートを持っています。 :)

最小バージョン

Rushyoはこのソリューションをここに投稿しました: CMDがAdministratorとして実行されているかどうかを検出する方法/昇格された特権を持っていますか?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
    ECHO NOT AN ADMIN!
)

エラーメッセージ、一時停止、および終了を追加するバージョン

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected! 
) ELSE (
   echo ######## ########  ########   #######  ########  
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ##       ##     ## ##     ## ##     ## ##     ## 
   echo ######   ########  ########  ##     ## ########  
   echo ##       ##   ##   ##   ##   ##     ## ##   ##   
   echo ##       ##    ##  ##    ##  ##     ## ##    ##  
   echo ######## ##     ## ##     ##  #######  ##     ## 
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!  
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

WinXP - > Win8(32/64ビット版を含む)で動作します。

編集:8/28/2012 Windows 8をサポートするために更新されました。@ BenHooperは以下の彼の答えでこれを指摘しました。彼の答えを支持してください。

74
blak3r

その他の問題

@Lectrodeが指摘したように、サーバーサービスの停止中にnet sessionコマンドを実行しようとすると、次のエラーメッセージが表示されます。

The Server service is not started.

More help is available by typing NET HELPMSG 2114

この場合、%errorLevel%変数は2に設定されます。

サーバーサービスは、セーフモード(ネットワークありまたはなし)で起動されません。

代替品を探しています

そのこと:

  • windows XP以降(32ビットおよび64ビット)でそのまま使用できます。
  • レジストリまたはシステムファイル/フォルダには触れません。
  • システムロケールに関係なく動作します。
  • セーフモードでも正しい結果が得られます。

そこで、Vanilla Windows XP仮想マシンを起動し、C:\Windows\System32フォルダー内のアプリケーションのリストをスクロールして、アイデアを得ようとしました。試行錯誤の後、これは私が思いついたdirty(駄目な)アプローチです:

fsutil dirty query %systemdrive% >nul

fsutil dirtyコマンドを実行するには管理者権限が必要で、そうでない場合は失敗します。 %systemdrive%環境変数 で、オペレーティングシステムがインストールされているドライブ文字を返します。出力はnulにリダイレクトされるため、無視されます。 %errorlevel%変数は、実行が成功した場合にのみ0に設定されます。

ドキュメントの内容は次のとおりです。

Fsutil dirty

ボリュームのダーティビットを照会または設定します。ボリュームのダーティビットが設定されている場合、autochkは、コンピューターの次回再起動時にボリュームのエラーを自動的にチェックします。

構文

fsutil dirty {query | set} <VolumePath>

パラメーター

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

備考

ボリュームのダーティビットは、ファイルシステムが一貫性のない状態にある可能性があることを示します。ダーティビットは次の理由で設定できます。

  • ボリュームはオンラインであり、顕著な変更があります。
  • ボリュームが変更され、変更がディスクにコミットされる前にコンピューターがシャットダウンされました。
  • ボリュームで破損が検出されました。

コンピューターの再起動時にダーティビットが設定されている場合、chkdskが実行され、ファイルシステムの整合性が検証され、ボリュームに関する問題の修正が試みられます。

ドライブCのダーティビットを照会するには、次のように入力します。

fsutil dirty query C:

さらなる研究

上記のソリューションはWindows XP以降で機能しますが、Windows 2000およびWindows PE(プリインストール環境)にはfsutil.exeが付属していないことを追加する価値があるため、他の手段に頼らなければなりません。

以前のテストで、パラメーターなしでsfcコマンドを実行すると、次のいずれかになることに気付きました。

  • 十分な特権がない場合はエラー。
  • 使用可能なパラメーターとその使用法のリスト。

つまり、パラメータなし、パーティなし。アイデアは、出力を解析して、エラー以外のものが得られたかどうかをチェックできるということです

sfc 2>&1 | find /i "/SCANNOW" >nul

エラー出力は最初に標準出力にリダイレクトされ、次にそれがfindコマンドにパイプされます。この時点で、onlyパラメーターを探す必要があります。このパラメーターは、Windows 2000以降の すべてのWindowsバージョンでサポート です:/SCANNOW。検索では大文字と小文字が区別されず、nulにリダイレクトすることで出力が破棄されます。

ドキュメントからの抜粋を次に示します。

Sfc

保護されたすべてのシステムファイルの整合性をスキャンおよび検証し、誤ったバージョンを正しいバージョンに置き換えます。

備考

sfc.exeを実行するには、Administratorsグループのメンバーとしてログオンする必要があります。

サンプルの使用法

貼り付けて実行する例を次に示します。

Windows XP以降

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000/Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

に適用されます

  • Windows 2000
  • Windows XP
  • Windows Vista
  • Windows 7
  • ウィンドウズ8
  • Windows 8.1
    ---
  • Windows PE
37
and31415

もう一つの方法

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

XP以降、すべてのWindowsシステムでfltmcコマンドが使用できるため、これはかなり移植性が高いはずです。


XP8.17でテストされたもう1つの解決策(残念ながらすべてのwin10マシンで機能するわけではありません - コメントを参照してください) - コンソールセッションに管理者特権がない場合にのみ表示される特定の変数=::が1つあります。その名前に=を含む変数を作成するには、これは管理者権限をチェックするための比較的信頼性の高い方法です(そしてそれは外部実行ファイルを呼び出さないのでかなり高速です)。

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)
17
npocmaka
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
17
Anders

代替ソリューション:

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause
14
Lucretius

チェックするだけでなく、自動的に管理者権限を取得する
別名Win 7/8/8.1 ffの自動UAC
:以下は、もう1つの機能を備えた非常にクールなものです。 (UAC対応のOS上にある場合は、以前にテストします。)

このトリックを使えば、「管理者権限で」バッチファイルを正しくクリックする必要がなくなります。忘れてしまった場合は、昇格した権限で開始すると、UACが自動的に起動します。さらに、OSがUACを必要としているか提供している場合は、最初にテストされます。 Win 8.1 /テストまでWin 2000/XP用。

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights! 
    rem pause
    goto :eof
)

このスニペットは、特に(1)Ben Hooperによるこのスレッドの管理テスト、および(2)BatchGotAdminに関するUACアクティベーションの読み取りおよびrobvanderwoudeによるバッチサイトの引用(参考)で、いくつかの優れたバッチパターンをまとめたものです。 (3) "VER | FINDSTR pattern"によるOSの識別については、参照が見つかりません。)

(いくつかの非常に小さな制限に関しては、 "NET SESSION"が他の答えで述べられているように動作しないときは、これらのコマンドのうちの別のものを自由に挿入してください。 - 一部の管理者にとっては、おそらくそうです。)

13
Philm

私は2つの方法で特権アクセスをチェックしていますが、どちらも信頼性が高く、ほとんどすべてのWindowsバージョンで非常に移植性があります。

1.方法

set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%

mkdir %WINDIR%\%guid%>nul 2>&1
rmdir %WINDIR%\%guid%>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

これはその単純さのために最も信頼できる方法の1つであり、この非常に原始的なコマンドの振る舞いはほとんど変わらないと思われます。 net sessionのようなadmin/networkポリシーで無効にできる他の組み込みCLIツールや、fsutilsのようなWindows 10の出力を変更するコマンドの場合は、そうではありません。 。

*XP以降で動作します

方法

REG ADD HKLM /F>nul 2>&1

IF %ERRORLEVEL%==0 (
    ECHO PRIVILEGED!
) ELSE (
    ECHO NOT PRIVILEGED!
)

Fsutilsを使用したり空のフォルダを作成したりするのと同じくらい面倒であっても、ユーザーディスクに触れるのが嫌いな場合がありますが、何か問題が発生すると壊滅的な障害が発生する可能性があります。このシナリオでは、レジストリの特権を確認するだけです。

このためにHKEY_LOCAL_MACHINEにデフォルトのアクセス権を使ってキーを作成しようとすることができますアクセスが拒否されましたERRORLEVEL == 1、あなたが管理者として実行するならそれは印刷します「コマンドは正常に実行されました」およびERRORLEVEL == 0。キーはすでに存在するため、レジストリには影響しません。これはおそらく最速の方法です、そしてREGは長い間そこにあります。

*NT以前(Win 9X)では使用できません。

*XP以降で動作します


実施例

一時フォルダをクリアするスクリプト

@echo off
:main
    echo.
    echo. Clear Temp Files script
    echo.

    call :requirePrivilegies

    rem Do something that require privilegies

    echo. 
    del %temp%\*.*
    echo. End!

    pause>nul
goto :eof


:requirePrivilegies
    set guid=%random%%random%-%random%-%random%-%random%-%random%%random%%random%
    mkdir %WINDIR%\%guid%>nul 2>&1
    rmdir %WINDIR%\%guid%>nul 2>&1
    IF NOT %ERRORLEVEL%==0 (
        echo ########## ERROR: ADMINISTRATOR PRIVILEGES REQUIRED ###########
        echo # This script must be run as administrator to work properly!  #
        echo # Right click on the script and select "Run As Administrator" #
        echo ###############################################################
        pause>nul
        exit
    )
goto :eof
11
Vitim.us

私が発見した、CMDスクリプトを使用して管理者特権をチェックする最も明確な方法は、次のようなものです。

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

このメソッドはCMD.exeビルトインのみを使用するため、非常に高速です。また、SIDやグループメンバーシップをチェックするのではなく、プロセスの実際の機能もチェックするため、有効パーミッションがテストされます。そして、これはWindows 2003とXPまでさかのぼります。通常のユーザープロセス、または昇格していないプロセスはディレクトリプローブに失敗します。管理プロセスまたは昇格プロセスは成功します。

6
William

次は、Windowsディレクトリにファイルを作成しようとします。それが成功すればそれを削除します。

copy /b/y NUL %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
if errorlevel 1 goto:nonadmin
del %WINDIR%\06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 >NUL 2>&1
:admin
rem here you are administrator
goto:eof
:nonadmin
rem here you are not administrator
goto:eof

06CF2EB6-94E6-4a60-91D8-AB945AE8CF38は今日生成されたGUIDであり、既存のファイル名と競合することはあり得ないと想定されることに注意してください。

5
Benoit

バッチスクリプトでElevate.cmdこのリンクを参照 )、私が書いた管理者権限を得る、私は次のようにしました:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

これはWindows 7、8、8.1、10そしてWindows XPでもテストされており、特別なディレクトリ、ファイル、レジストリキーなどのリソースを必要としません。 。

5
Matt

Whoami/groupsは1つのケースでは機能しません。 UACが完全にオフになっている(通知がオフになっているだけでなく)、、およびの場合は、管理者プロンプトから開始してから発行します。

runas /trustlevel:0x20000 cmd

昇格しないで実行しますが、次のコマンドを発行します。

whoami /groups

あなたが昇格していると言うでしょう。それは間違っています。それが間違っている理由はここにあります:

この状態で実行している場合、IsUserAdmin( https://msdn.Microsoft.com/ja-jp/library/windows/desktop/aa376389(v = vs.85).aspx )がFALSEを返し、 UACは完全に無効にされ、GetTokenInformationはTokenElevationTypeDefault( http://blogs.msdn.com/b/cjacks/archive/2006/10/24/modifying-the-mandatory-integrity-level-for-a- Windows Vistaのセキュリティで保護されたオブジェクトVista.aspx )その場合、プロセスは昇格されていないですが、whoami /groupsはそれを主張しています。

実際、バッチファイルからこれを行うための最良の方法は次のとおりです。

net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%

net sessionを2回実行する必要があります。これは、誰かがatを事前に作成した場合、誤った情報が得られるためです。

4
zumalifeguard

サーバによっては、コマンド "net session"が要求するサービスを無効にします。これは、あなたが持っているかもしれないとき、あなたが管理者権限を持っていないと常に言っている管理者チェックをもたらします。

2
Dan

編集:copyitrightはこれは信頼できないと指摘した。 UACで読み取りアクセスを承認すると、dirは成功します。私はもう一つの可能​​性を提供するためにもう少しスクリプトを持っています、しかしそれは読み取り専用ではありません。

reg query "HKLM\SOFTWARE\Foo" >NUL 2>NUL && goto :error_key_exists
reg add "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_not_admin
reg delete "HKLM\SOFTWARE\Foo" /f >NUL 2>NUL || goto :error_failed_delete
goto :success

:error_failed_delete
  echo Error unable to delete test key
  exit /b 3
:error_key_exists
  echo Error test key exists
  exit /b 2
:error_not_admin
  echo Not admin
  exit /b 1
:success
  echo Am admin

以下の古い答え

警告:信頼できません


ここで他のいくつかの良い答えとand31415によって提起されたポイントに基づいて、私は私が以下のファンであることがわかりました:

dir "%SystemRoot%\System32\config\DRIVERS" 2>nul >nul || echo Not Admin

ほとんど依存関係はありません。

2
Tyler Szabo
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
2
Totonga

PowerShell誰?

param (
    [string]$Role = "Administrators"
)

#check for local role

$identity  = New-Object Security.Principal.WindowsIdentity($env:UserName)
$principal = New-Object Security.Principal.WindowsPrincipal($identity)

Write-Host "IsInRole('$Role'): " $principal.IsInRole($Role)

#enumerate AD roles and lookup

$groups = $identity::GetCurrent().Groups
foreach ($group in $groups) {
    $trans = $group.Translate([Security.Principal.NTAccount]);
    if ($trans.Value -eq $Role) {
       Write-Host "User is in '$Role' role"
    }
}
1
Ostati

注:\ system32\config\systemをcaclsでチェックすると、WOW64では常に失敗します(たとえば、%systemroot%\ syswow64\cmd.exe/32ビットTotal Commanderなど)。64ビットシステムの32ビットシェルで実行されるスクリプトは永久にループします。 ...より良いのは、プリフェッチディレクトリの権限をチェックすることです。

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"

Win XP 7はテスト済みですが、Windows 7 install.wimのようにWinPEでは失敗しますが、そのようなディレクトリやcacls.exeはありません。

また、winPEでは、wow64はopenfiles.exeによるチェックに失敗します。

OPENFILES > nul

Windows 7では、「ターゲットシステムは32ビットオペレーティングシステムである必要があります」という情報で、「1」とエラーレベルになります。

どちらのチェックもおそらく回復コンソールで失敗するでしょう。

何が動作します Windows XP - 8 32/64ビット、WOW64およびWinPEは以下のとおりです。dir作成テスト(IF adminがすべてのユーザーのアクセス許可を持つWindowsディレクトリにカーペットをぶつけなかった場合)。 ..)と

net session

そして

reg add HKLM /F

チェックします。

.vbsスクリプトから直接bat/cmdを呼び出すレジストリエントリによっては、XP(および他のバージョンもおそらく管理者のいじりによりますが)いくつかのウィンドウでもう1つ注意が必要です。何かに関連付けられている...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

一方、bat/cmdファイルのパラメータを指定してcmd.exeを呼び出すと、問題なく動作します。

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo
1
user2902818

この質問やリンクされた質問、およびSEの他の部分では、文字通り何十もの答えがありますが、いずれにしても不十分です。Windowsが信頼性の高い組み込みコンソールユーティリティを提供しないことを示しています。だから、それはあなた自身をロールアウトする時が来ました。

次のCコードは、 プログラムが完全な管理者権限で実行されているかどうかを検出 に基づいており、Win2k +で動作します。1、どこでもそしてすべての場合(UAC、ドメイン、推移的なグループ...) - それはパーミッションをチェックするときそれがシステム自体と同じようにするからです。それはメッセージ(それはスイッチで沈黙させることができる)と終了コードの両方で結果を知らせます。

それは一度だけコンパイルする必要があります、そしてあなたはただどこでも.exeをコピーすることができます - それはkernel32.dlladvapi32.dllだけに依存します(私は コピーをアップロードしました )。

chkadmin.c

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

1MSDNは、APIはXP +であると主張していますが、これは誤りです。 CheckTokenMembership2k +である そして他の1つ さらに古い 。最後のリンクには、NTでも機能する、はるかに複雑な方法も含まれています。

1
ivan_pozdeev

これはリストに追加するもう一つのものです;-)

(システムの場所にファイルを作成しようとする)

CD.>"%SystemRoot%\System32\Drivers\etc\_"
MODE CON COLS=80 LINES=25

IF EXIST "%SystemRoot%\System32\Drivers\etc\_" (

  DEL "%SystemRoot%\System32\Drivers\etc\_"

  ECHO Has Admin privileges

) ELSE (

  ECHO No Admin privileges

)

MODE CONは画面を再初期化し、システムロケーションへの書き込み権限がない場合はテキスト/エラーをすべて抑制します。

1
script'n'code

最も簡単な方法はシステムの日付を変更することです(管理者権限が必要です)。

date %date%
if errorlevel 1 (
   echo You have NOT admin rights
) else (
   echo You have admin rights
)

%date%変数に曜日が含まれる場合は、DATEコマンドの最後の部分から日付を取得してください。

for /F "delims=" %%a in ('date ^<NUL') do set "today=%%a" & goto break
:break
for %%a in (%today%) do set "today=%%a"
date %today%
if errorlevel 1 ...
0
Aacini
@echo off
ver
set ADMDIR=C:\Users\Administrator
dir %ADMDIR% 1>nul 2>&1
echo [%errorlevel%] %ADMDIR%
if "%errorlevel%"=="0" goto main
:: further checks e.g. try to list the contents of admin folders
:: wherever they are stored on older versions of Windows
echo You need administrator privileges to run this script: %0
echo Exiting...
exit /b

:main
echo Executing with Administrator privileges...
0
cmd

Net User %username% >nul 2>&1 && echo admin || echo not admin

0
heretic
@echo off
:start
set randname=%random%%random%%random%%random%%random%
md \windows\%randname% 2>nul
if %errorlevel%==0 (echo You're elevated!!!
goto end)
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
goto start
:end
rd \windows\%randname% 2>nul
pause >nul

コードを1行ずつ説明します。

@echo off

これがないと、ユーザーは1行以上でイライラするでしょう。

:start

プログラムの開始点.

set randname=%random%%random%%random%%random%%random%

作成するディレクトリのファイル名を設定してください。

md \windows\%randname% 2>nul

<DL>:\Windowsにディレクトリを作成します(<DL>をドライブ名に置き換えます)。

if %errorlevel%==0 (echo You're elevated!!!
goto end)

ERRORLEVEL環境変数がゼロの場合、成功メッセージが表示されます。
最後まで進みます(それ以上先に進まないでください)。

if %errorlevel%==1 (echo You're not elevated :(:(
goto end)

ERRORLEVELが1の場合、失敗メッセージをエコーし​​て最後に進みます。

goto start

ファイル名がすでに存在する場合は、フォルダを再作成します(そうでない場合はgoto endコマンドを実行しても実行されません)。

:end

終点を指定してください

rd \windows\%randname% 2>nul

作成したディレクトリを削除します。

pause >nul

ユーザーがメッセージを見ることができるように一時停止します。

>nulおよび2>nulは、これらのコマンドの出力をフィルタリングしています。

0
EKons

代替方法:この目的のために設計された外部ユーティリティ、たとえば IsAdmin.exe (無制限のフリーウェア)を使用してください。

終了コード

0 - 現在のユーザーはAdministratorsグループのメンバーではありません

1 - 管理者の現在のユーザーメンバーで、実行中の管理者

2 - 管理者の現在のユーザーメンバー、ただし昇格していない

0
Bill_Stewart

管理者でなくてもnet sessionを使用できるユーザーを見つけました。私はその理由を調べませんでした。私の回避策は、ユーザーがwindowsフォルダーにフォルダーを作成できるかどうかをテストすることです。

これが私のコードです:

::::::: :testadmin function START :::::::
:: this function tests if current user is admin.  results are returned as "true" or "false" in %isadmin%
:: Test "%isadmin" after calling this function
:: Usage: "call :testadmin"
echo Your script entered the :testadmin function by error.  Usage: "call :testadmin"
pause
exit /b
:testadmin

 rd %windir%\local_admin_test > nul 2> nul
 md %windir%\local_admin_test > nul 2> nul
 if [%errorlevel%]==[0] set isadmin=true
 if not [%errorlevel%]==[0] set isadmin=false
 rd %windir%\local_admin_test > nul 2> nul

 if [%isadmin%]==[true] (
   echo User IS admin.
 )
 if not [%isadmin%]==[true] (
   echo User IS NOT admin.
   timeout 30
   :: or use "pause" instead of "timeout"
   exit /b
 )
exit /b
:::::: :testadmin function END ::::::
0
Grallen