Проверьте, была ли запущена текущая командная строка в качестве администратора

Я ищу, чтобы написать сценарий, который принимает пользовательский ввод, а затем меняет системные изменения. Мне нужно, чтобы это было очень универсальным, но просто поставлено наверху, мне нужно, чтобы он проверял, выполняется ли он как «Администратор». Если это не так, я хочу показать сообщение, чтобы сообщить им об этом; Если это так, я хочу, чтобы он продолжался. Есть ли постоянный способ проверить это? Я не собираюсь запускать новый сеанс в качестве администратора, я просто хочу определить , запущен ли он в настоящее время как администратор

Обнаружено это при переполнении стека :

@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 +, а другой еще старше .

  • Как я могу отображать временную метку файла с секундами, из командной строки?
  • Как запустить несколько команд в одной строке в Powershell?
  • Как установить путь для команд sudo
  • Команда командной строки (cmd) для блокировки машины Windows
  • Как удалить файлы, превышающие определенную дату на linux
  • Какие торрент-приложения работают без головы (только из командной строки)?
  • Получить текущую папку с помощью команды DOS?
  • Проверка использования пропускной способности конкретного приложения или процесса в Windows 7
  • Возможные значения% PROCESSOR_ARCHITECTURE%
  • Хорошая альтернатива Cygwin с копией / вставкой?
  • Переименование в командной строке
  • Interesting Posts

    Как может быть bcrypt иметь встроенные соли?

    Как создать горизонтальный ListView с помощью RecyclerView?

    Организационно, где я должен ставить общие запросы при первом использовании кода Entity Framework?

    Создайте реактивную публикацию с дополнительными полями в каждом документе

    Как получить доступ к определенному элементу в списке с помощью DataTemplate?

    как получить скриптовый каталог в POSIX sh?

    Как распаковать zip-архивы, которые имеют более 260 символов в их имени?

    Доступ к объекту с нечетным именем, возвращаемым getSymbols

    Когда следует использовать тип HashSet ?

    Как переключаться между кадрами в Selenium WebDriver с помощью Java

    Использование функций xpath в верхнем и нижнем регистре в среде IDE seleniumа

    Пустая страница, когда я использую FusionTablesLayer с Google Maps JavaScript API v3

    getopt.h: Компиляция C-кода Linux в Windows

    Почему восстановленные файлы .xls и .doc отображаются как символы?

    Создание приложения ASP.NET для преобразования текста в речь

    Давайте будем гением компьютера.