Я ищу написать сценарий, который принимает пользовательский ввод, а затем вносит изменения в масштабе всей системы. Мне нужно, чтобы это было очень обобщенно, но, проще говоря, мне нужно, чтобы оно проверялось, запускается ли «как администратор». Если это не так, то я хочу показать сообщение, чтобы сказать им это; если это так, я хочу, чтобы это продолжалось. Есть ли постоянный способ проверить это? Я не хочу начинать новый сеанс с правами администратора, я просто хочу определить , запущен ли он как администратор
4 ответа
Нашел это на переполнении стека:
@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
)
Многие, многие ответы на этот и многие другие вопросы в 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+, а другой еще старше.
Я обнаружил, что самый простой способ проверки прав администратора с использованием сценария 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
или другой подобной группе дано разрешение на чтение в systemmprofile. Разумеется, это нестандартная конфигурация, отличная от тех, что установлены на компьютерах, настроенных как контроллеры домена Windows, которые дают права NT / AUTHORITY\Authenticated Users на чтение / выполнение для системной профили.