Проверьте, была ли запущена текущая командная строка в качестве администратора
Я ищу, чтобы написать сценарий, который принимает пользовательский ввод, а затем меняет системные изменения. Мне нужно, чтобы это было очень универсальным, но просто поставлено наверху, мне нужно, чтобы он проверял, выполняется ли он как «Администратор». Если это не так, я хочу показать сообщение, чтобы сообщить им об этом; Если это так, я хочу, чтобы он продолжался. Есть ли постоянный способ проверить это? Я не собираюсь запускать новый сеанс в качестве администратора, я просто хочу определить , запущен ли он в настоящее время как администратор
- Java.exe -version и pushd?
- Запуск MySQL из командной строки без потери подсказки
- Открытие текущего каталога в Explorer
- Как подключить файловую систему NTFS, разрешая всем пользователям полный доступ?
- Переход к предыдущему каталогу в командной строке Windows
- Как рекурсивно удалить каталог из командной строки в Windows?
- Что эквивалентно Linux ~ ~ (тильда) Linux в Windows?
- Как отключить и включить порт USB через командную строку?
Обнаружено это при переполнении стека :
@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
Это проверяет высокий уровень целостности. (Работает для Windows Vista и выше)
@echo off whoami /groups | find "S-1-16-12288" > nul if %errorlevel% == 0 ( echo Welcome, Admin ) else ( echo Get lost, User )
Самый чистый способ проверить права администратора с использованием сценария 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. Обычные пользовательские процессы или отдельные процессы выходят из строя с помощью зонда каталога, где в случае успешного администрирования или повышенных процессов.
Этот тест терпит неудачу, если Everyone
, BUILTIN\Users
или другой подобной группе предоставляется разрешение на чтение для системного файла. Разумеется, это нестандартная конфигурация, отличная от машин, настроенных как контроллеры домена Windows, которые предоставляют права на чтение / выполнение NT AUTHORITY \ Authenticated Users для системного файла.
Многие, многие ответы на это и несколько других вопросов по SE ( 1 , 2 , 3, чтобы назвать несколько), все из которых так или иначе несовершенны, ясно показали, что Windows не предоставляет надежную встроенную утилиту , Итак, пришло время развернуть свои собственные.
Без каких-либо дополнительных грязных хаков:
Скомпилируйте следующую программу (инструкции следуйте) или получите предварительно скомпилированную копию . Это нужно сделать только один раз, тогда вы можете копировать .exe
всюду (например, рядом с Sysinternals Suite ).
Код работает в Win2k + 1 , как с UAC, так и с доменами, транзитными группами и т. Д., Независимо от того, как он использует то же самое, что и сама система при проверке разрешений. chkadmin
печатает «Admin» или «Non-admin» и устанавливает код выхода 0 или 1 соответственно. Выход может быть подавлен с помощью переключателя /q
.
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; }
Чтобы выполнить компиляцию, запустите в командной строке Windows SDK:
cl /Ox chkadmin.c
(Если вы используете VS2012 +, необходимы дополнительные настройки, если вам нужно настроить таргетинг на 2k / XP )
Этот метод любезно предоставлен https://stackoverflow.com/questions/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908
1 MSDN утверждает, что API – это XP +, но это неверно. CheckTokenMembership
– 2k +, а другой еще старше .