現在のバッチスクリプトに管理者権限があるかどうかを確認する方法
自分自身をrunasで呼び出す方法は知っていますが、管理者権限を確認する方法はわかりません。私が見た唯一の解決策は、大雑把なハックの仕事か外部のプログラムを使うことです。 Windows XP以降で動作するのであれば、ハックジョブであるかどうかはあまり気にしません。
blak3r / Rushyo の解決策は、Windows 8を除くすべてのシステムで問題なく機能します。Windows8でAT
name__を実行すると、次のようになります。
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
。含まれていない真、クリーンで普遍的な解決策
FOR
name__ループから返されたデータの分析AT
name__(Windows 8非互換)またはWHOAMI
name__(Windows XP非互換)の使用.それぞれに独自のセキュリティ、使いやすさ、および移植性の問題があります。
私はこれがうまくいくことを独自に確認しました:
(スクリーンショット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
は "サーバーコンピュータの接続を管理します。パラメータなしで使用され、ローカルコンピュータとのすべてのセッションに関する情報を表示します。" に使用される標準的なコマンドです。
だから、これは私の与えられた実装の基本的なプロセスです:
@echo off
goto check_Permissions
:check_Permissions
コードブロックにジャンプnet session >nul 2>&1
STDOUT
name__)ストリームをnul
name__にリダイレクトするSTDERR
name__)を数値ハンドル1と同じ宛先にリダイレクトするif %errorLevel% == 0
%errorLevel%
)の値が0
である場合、これはエラーが発生していないことを意味します、したがって直前のコマンドが正常に実行されたelse
name __ %errorLevel%
)の値が0
ではない場合、これはエラーが発生したことを意味します、したがって直前のコマンドの実行が失敗しましたが失敗しましたWindowsではNET SESSION
XP x86 - Windows 8 x 64 :
あなたの受け入れられた答えを私のものに変えてくれてありがとう、@ Tilka。 :)
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は以下の彼の答えでこれを指摘しました。彼の答えを支持してください。
@Lectrodeが指摘したように、サーバーサービスの停止中にnet session
コマンドを実行しようとすると、次のエラーメッセージが表示されます。
The Server service is not started.
More help is available by typing NET HELPMSG 2114
この場合、%errorLevel%
変数は2
に設定されます。
注サーバーサービスは、セーフモード(ネットワークありまたはなし)で起動されません。
そのこと:
そこで、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グループのメンバーとしてログオンする必要があります。
貼り付けて実行する例を次に示します。
@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
@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
もう一つの方法
fltmc >nul 2>&1 && (
echo has admin permissions
) || (
echo has NOT admin permissions
)
XP以降、すべてのWindowsシステムでfltmc
コマンドが使用できるため、これはかなり移植性が高いはずです。
XP
、8.1
、7
でテストされたもう1つの解決策(残念ながらすべてのwin10
マシンで機能するわけではありません - コメントを参照してください) - コンソールセッションに管理者特権がない場合にのみ表示される特定の変数=::
が1つあります。その名前に=
を含む変数を作成するには、これは管理者権限をチェックするための比較的信頼性の高い方法です(そしてそれは外部実行ファイルを呼び出さないのでかなり高速です)。
setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! (
echo has NOT admin permissions
) else (
echo has admin permissions
)
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
echo admin...
)
代替ソリューション:
@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
チェックするだけでなく、自動的に管理者権限を取得する
別名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"が他の答えで述べられているように動作しないときは、これらのコマンドのうちの別のものを自由に挿入してください。 - 一部の管理者にとっては、おそらくそうです。)
私は2つの方法で特権アクセスをチェックしていますが、どちらも信頼性が高く、ほとんどすべてのWindowsバージョンで非常に移植性があります。
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
私が発見した、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までさかのぼります。通常のユーザープロセス、または昇格していないプロセスはディレクトリプローブに失敗します。管理プロセスまたは昇格プロセスは成功します。
次は、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であり、既存のファイル名と競合することはあり得ないと想定されることに注意してください。
バッチスクリプトで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でもテストされており、特別なディレクトリ、ファイル、レジストリキーなどのリソースを必要としません。 。
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
を事前に作成した場合、誤った情報が得られるためです。
サーバによっては、コマンド "net session"が要求するサービスを無効にします。これは、あなたが持っているかもしれないとき、あなたが管理者権限を持っていないと常に言っている管理者チェックをもたらします。
編集: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
ほとんど依存関係はありません。
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
echo ... connected as admin
)
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"
}
}
注:\ 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
この質問やリンクされた質問、およびSEの他の部分では、文字通り何十もの答えがありますが、いずれにしても不十分です。Windowsが信頼性の高い組み込みコンソールユーティリティを提供しないことを示しています。だから、それはあなた自身をロールアウトする時が来ました。
次のCコードは、 プログラムが完全な管理者権限で実行されているかどうかを検出 に基づいており、Win2k +で動作します。1、どこでもそしてすべての場合(UAC、ドメイン、推移的なグループ...) - それはパーミッションをチェックするときそれがシステム自体と同じようにするからです。それはメッセージ(それはスイッチで沈黙させることができる)と終了コードの両方で結果を知らせます。
それは一度だけコンパイルする必要があります、そしてあなたはただどこでも.exe
をコピーすることができます - それはkernel32.dll
とadvapi32.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 +であると主張していますが、これは誤りです。 CheckTokenMembership
2k +である そして他の1つ さらに古い 。最後のリンクには、NTでも機能する、はるかに複雑な方法も含まれています。
これはリストに追加するもう一つのものです;-)
(システムの場所にファイルを作成しようとする)
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
は画面を再初期化し、システムロケーションへの書き込み権限がない場合はテキスト/エラーをすべて抑制します。
最も簡単な方法はシステムの日付を変更することです(管理者権限が必要です)。
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 ...
@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...
Net User %username% >nul 2>&1 && echo admin || echo not admin
@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
は、これらのコマンドの出力をフィルタリングしています。
代替方法:この目的のために設計された外部ユーティリティ、たとえば IsAdmin.exe (無制限のフリーウェア)を使用してください。
終了コード
0 - 現在のユーザーはAdministratorsグループのメンバーではありません
1 - 管理者の現在のユーザーメンバーで、実行中の管理者
2 - 管理者の現在のユーザーメンバー、ただし昇格していない
管理者でなくても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 ::::::