How do I check if the current batch script has admin rights?
I know how to make it call itself with runas but not how to check for admin rights. The only solutions I've seen are crude hack jobs or use external programs. Well, actually I don't care if it is a hack job as long as it works on Windows XP and newer.
blak3r / Rushyo's solution works fine for everything except Windows 8. Running AT
on Windows 8 results in:
The AT command has been deprecated. Please use schtasks.exe instead.
The request is not supported.
(see screenshot #1) and will return %errorLevel%
1
.
So, I went searching for other commands that require elevated permissions. rationallyparanoid.com had a list of a few, so I ran each command on the two opposite extremes of current Windows OSs (XP and 8) in the hopes of finding a command that would be denied access on both OSs when run with standard permissions.
Eventually, I did find one - NET SESSION
. A true, clean, universal solution that doesn't involve:
FOR
loopsAT
(Windows 8 incompatible) or WHOAMI
(Windows XP incompatible). Each of which have their own security, usability, and portability issues.
I've independently confirmed that this works on:
(see screenshot #2)
So, to use this solution, simply do something like this:
@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
Available here, if you're lazy: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat
NET SESSION
is a standard command used to "manage server computer connections. Used without parameters, [it] displays information about all sessions with the local computer."
So, here's the basic process of my given implementation:
@echo off
goto check_Permissions
:check_Permissions
code blocknet session >nul 2>&1
STDOUT
) stream to nul
STDERR
) to the same destination as numeric handle 1if %errorLevel% == 0
%errorLevel%
) is 0
then this means that no errors have occurred and, therefore, the immediate previous command ran successfullyelse
%errorLevel%
) is not 0
then this means that errors have occurred and, therefore, the immediate previous command ran unsuccessfully
NET SESSION
on Windows XP x86 - Windows 8 x64:
Thank you, @Tilka, for changing your accepted answer to mine. :)