Пакетный скрипт: как проверить права администратора
Как проверить, имеет ли текущий пакетный скрипт права администратора?
Я знаю, как заставить его вызывать себя с помощью runas, но не знаю, как проверить права администратора. Единственные решения, которые я видел, - это грубые хакерские задания или использование внешних программ. Ну, на самом деле мне все равно, если это хакерская работа, если она работает на Windows XP и новее.
27 ответов
вопросы
Решение blak3r / Rushyo прекрасно работает для всего, кроме Windows 8. Запуск AT
в Windows 8 результаты:
The AT command has been deprecated. Please use schtasks.exe instead.
The request is not supported.
(см. скриншот № 1) и вернется %errorLevel%
1
,
Исследование
Итак, я пошел искать другие команды, которые требуют повышенных разрешений. У rationallyparanoid.com был список из нескольких, поэтому я запускал каждую команду на двух противоположных крайностях текущих операционных систем Windows (XP и 8) в надежде найти команду, которой будет запрещен доступ в обеих ОС при запуске со стандартными разрешениями.
В конце концов, я нашел один - NET SESSION
, Истинное, чистое, универсальное решение, которое не включает:
- создание или взаимодействие с данными в безопасных местах
- анализ данных, возвращаемых из
FOR
петли - поиск строк для "Администратор"
- с помощью
AT
(Windows 8 несовместима) илиWHOAMI
(Windows XP несовместима).
У каждого из них есть свои проблемы безопасности, удобства использования и переносимости.
тестирование
Я независимо подтвердил, что это работает на:
- Windows XP, x86
- Windows XP, x64
- Windows Vista, x86
- Windows Vista, x64
- Windows 7, x86
- Windows 7, x64
- Windows 8, x86
- Windows 8, x64
(см. скриншот № 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
- Команда запуска
- Скрыть визуальный вывод команды
- Перенаправление стандартного вывода (числовой дескриптор 1 /
STDOUT
) поток вnul
- Перенаправление стандартного потока вывода ошибок (числовой дескриптор 2 /
STDERR
) к тому же месту назначения, что и числовой дескриптор 1
- Перенаправление стандартного вывода (числовой дескриптор 1 /
if %errorLevel% == 0
- Если значение кода выхода (
%errorLevel%
) есть0
тогда это означает, что ошибок не было и, следовательно, предыдущая команда была успешно выполнена
- Если значение кода выхода (
else
- Если значение кода выхода (
%errorLevel%
) нет0
тогда это означает, что произошли ошибки и, следовательно, предыдущая команда была выполнена неудачно
- Если значение кода выхода (
- Код между соответствующими круглыми скобками будет выполняться в зависимости от того, каким критериям соответствует
Скриншоты
Windows 8 AT
%errorLevel%
:
NET SESSION
в Windows XP x86 - Windows 8 x64:
Спасибо, @Tilka, за изменение принятого ответа на мой.:)
Решение Андерса сработало для меня, но я не был уверен, как инвертировать его, чтобы получить противоположное (когда вы не были администратором).
Вот мое решение. У него есть два случая IF и ELSE, а также несколько примеров ascii, чтобы люди действительно читали его.:)
Минимальная версия
Rushyo разместил это решение здесь: Как определить, работает ли CMD от имени администратора или имеет повышенные привилегии?
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 битные версии).
РЕДАКТИРОВАТЬ: 28.08.2012 Обновлено для поддержки Windows 8. @BenHooper указал на это в своем ответе ниже. Пожалуйста, подтвердите его ответ.
Больше вопросов
Как указывает @Lectrode, если вы попытаетесь запустить net session
При остановленной службе сервера вы получаете следующее сообщение об ошибке:
The Server service is not started.
More help is available by typing NET HELPMSG 2114
В этом случае %errorLevel%
переменная будет установлена в 2
,
Примечание. Служба сервера не запускается в безопасном режиме (с сетевым подключением или без него).
Ищу альтернативу
Что-то, что:
- может быть запущен из коробки на Windows XP и более поздних версиях (32 и 64 бит);
- не касается реестра или каких-либо системных файлов / папок;
- работает независимо от локали системы;
- дает правильные результаты даже в безопасном режиме.
Итак, я загрузил виртуальную машину с Windows XP и начал просматривать список приложений в C:\Windows\System32
папка, пытаясь получить некоторые идеи. После проб и ошибок это грязный (каламбур) подход, который я придумал:
fsutil dirty query %systemdrive% >nul
fsutil dirty
Команда требует прав администратора для запуска, и в противном случае произойдет сбой. %systemdrive%
переменная среды, которая возвращает букву диска, на котором установлена операционная система Выход перенаправлен на nul
, таким образом, игнорируется. %errorlevel%
переменная будет установлена в 0
только при успешном исполнении.
Вот что говорится в документации:
Фустил грязный
Запрашивает или устанавливает грязный бит тома. Когда установлен грязный бит тома, 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
команда. На данный момент мы должны искать единственный параметр, который поддерживается во всех версиях Windows начиная с Windows 2000: /SCANNOW
, Поиск нечувствителен к регистру, а вывод отбрасывается путем перенаправления его на nul
,
Вот выдержка из документации:
Sfc
Сканирует и проверяет целостность всех защищенных системных файлов и заменяет неправильные версии правильными версиями.
замечания
Вы должны войти в систему как член группы администраторов, чтобы запустить sfc.exe.
Образец использования
Вот несколько примеров вставки и запуска:
Windows XP и выше
@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
Windows 2000 / Windows PE
@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
Относится к
- Windows 2000
- Windows XP
- Виндоус виста
- Windows 7
- Windows 8
- Windows 8.1
--- - Windows PE
Еще один способ
fltmc >nul 2>&1 && (
echo has admin permissions
) || (
echo has NOT admin permissions
)
fltmc
Команда доступна в любой системе Windows начиная с XP, поэтому она должна быть довольно переносимой.
Еще одно решение, протестированное на XP
,8.1
,7
(к сожалению не работает на всех win10
машины - см. комментарии.) - есть одна конкретная переменная =::
который отображается только в том случае, если консольный сеанс не имеет прав администратора. Поскольку создать переменную, содержащую =
по своему названию это сравнительно надежный способ проверки прав администратора (и довольно быстрый, поскольку он не вызывает внешние исполняемые файлы)
setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! (
echo has NOT admin permissions
) else (
echo has admin permissions
)
Альтернативное решение:
@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
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
echo admin...
)
У меня есть два способа проверки привилегированного доступа, оба довольно надежны и очень переносимы практически во всех версиях Windows.
1. Метод
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!
)
Это один из самых надежных методов из-за его простоты, и поведение этой очень примитивной команды вряд ли изменится. Это не относится к другим встроенным инструментам CLI, таким как net session, которые можно отключить с помощью политик администратора / сети, или к командам, таким как fsutils, которые изменили вывод в Windows 10.
* Работает на XP и позже
2. Метод
REG ADD HKLM /F>nul 2>&1
IF %ERRORLEVEL%==0 (
ECHO PRIVILEGED!
) ELSE (
ECHO NOT PRIVILEGED!
)
Иногда вам не нравится идея трогать диск пользователя, даже если он такой же безобидный, как использование fsutils или создание пустой папки, если он недоказуем, но может привести к катастрофической ошибке, если что-то пойдет не так. В этом случае вы можете просто проверить реестр на наличие привилегий.
Для этого вы можете попытаться создать ключ в HKEY_LOCAL_MACHINE, используя разрешения по умолчанию, которые вы получите Отказ в доступе, и
ERRORLEVEL == 1
, но если вы запускаете от имени администратора, он напечатает "команда выполнена успешно" иERRORLEVEL == 0
, Поскольку ключ уже существует, он не влияет на реестр. Это, наверное, самый быстрый путь, и РЭГ существует там долгое время.* Это не доступно на pre 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
Не только проверять, но и автоматически получать права администратора
ака Автоматический UAC для Win 7/8/8.1 и далее. Следующее является действительно классным и имеет еще одну особенность: этот пакетный фрагмент не только проверяет права администратора, но и получает их автоматически! (и тестирует раньше, если живет на ОС с поддержкой UAC.)
С этим трюком вам больше не нужно кликать правой кнопкой мыши на вашем командном файле "с правами администратора". Если вы забыли, чтобы запустить его с повышенными правами, UAC появится автоматически! Более того, сначала он тестируется, если ОС требует / предоставляет UAC, поэтому он ведет себя корректно, например, для Win 2000/XP до тех пор, пока не протестируется Win 8.1.
@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) тест администратора в этой теме, выполненный Беном Хупером, и (2) активация UAC, прочитанная на BatchGotAdmin и процитированная на сайте пакетной обработки robvanderwoude (уважение). (3) Для идентификации ОС по "VER | FINDSTR pattern" я просто не нахожу ссылку.)
(Что касается некоторых очень незначительных ограничений, когда "NET SESSION" не работает, как упомянуто в другом ответе, не стесняйтесь вставлять другую из этих команд. Для меня работа в безопасном режиме Windows или специальные стандартные службы не работают, и это не является важным вариантом использования) - для некоторых администраторов, возможно, они есть.)
В пакетном скрипте 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 и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра.
Я обнаружил, что самый простой способ проверки прав администратора с использованием сценария 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. Обычные пользовательские процессы или процессы без прав доступа не проходят проверку каталога, где успешно выполняются процессы администратора или повышенные права.
Whoami / группы не работает ни в одном случае. Если у вас полностью отключено UAC (не только уведомление отключено), и вы начали с приглашения администратора, введите:
runas /trustlevel:0x20000 cmd
вы будете работать без повышенных прав, но с выдачей:
whoami /groups
скажу, что ты возвышен Это не правильно. Вот почему это неправильно:
При работе в этом состоянии, если IsUserAdmin ( https://msdn.microsoft.com/en-us/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-securable-object-in-windows-vista.aspx) тогда процесс не запущен повышенным, но whoami /groups
утверждает, что это так.
действительно, лучший способ сделать это из командного файла:
net session >nul 2>nul
net session >nul 2>nul
echo %errorlevel%
Ты должен сделать net session
дважды, потому что если кто-то сделал at
перед тем, как вы получите неправильную информацию.
Следующее пытается создать файл в каталоге 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, созданный сегодня, и предполагается, что он маловероятен для конфликта с существующим именем файла.
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"
}
}
Коллекция из четырех, казалось бы, наиболее совместимых методов с этой страницы. Первый действительно гениален. Проверено с XP и выше. Смущает, однако, что нет стандартной команды для проверки прав администратора. Думаю, сейчас они просто сосредоточились на PowerShell, который действительно бесполезен для большей части моей работы.
Я назвал пакет "exit-if-not-admin.cmd", который можно вызывать из других пакетов, чтобы убедиться, что они не продолжают выполнение, если не предоставлены необходимые права администратора.
rem Sun May 03, 2020
rem Methods for XP+ used herein based on:
rem https://stackru.com/questions/4051883/batch-script-how-to-check-for-admin-rights
goto method1
:method1
setlocal enabledelayedexpansion
set "dv==::"
if defined !dv! goto notadmin
goto admin
:method2
call fsutil dirty query %SystemDrive% >nul
if %ERRORLEVEL%==0 goto admin
goto notadmin
:method3
net session >nul 2>&1
if %ERRORLEVEL%==0 goto admin
goto notadmin
:method4
fltmc >nul 2>&1 && goto admin
goto notadmin
:admin
echo Administrator rights detected
goto end
:notadmin
echo ERROR: This batch must be run with Administrator privileges
pause
exit /b
goto end
:end```
Некоторые серверы отключают службы, необходимые для команды "net session". В результате проверки администратора всегда говорят, что у вас нет прав администратора, когда у вас есть.
Редактировать: авторское право указало, что это ненадежно. Утверждение доступа для чтения с помощью UAC позволит каталогу успешно работать. У меня есть немного больше сценария, чтобы предложить другую возможность, но он не только для чтения.
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
Мало зависимости и быстро.
Примечание. Проверка с помощью cacls для \system32\config\system ВСЕГДА завершится неудачей в WOW64 (например, из%systemroot%\syswow64\cmd.exe / 32-битного Total Commander), поэтому сценарии, которые выполняются в 32-битной оболочке в 64-битной системе, будут зациклены навсегда... Лучше бы проверить права на каталог Prefetch:
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"
Win XP до 7 протестирована, однако в WinPE она не работает, как в Windows 7 install.wim нет ни dir, ни cacls.exe
Также в winPE AND wow64 не удается проверить с помощью openfiles.exe:
OPENFILES > nul
В Windows 7 он будет иметь уровень ошибки "1" с информацией о том, что "Целевая система должна быть 32-битной операционной системой"
Обе проверки, вероятно, также не пройдут в консоли восстановления.
В Windows XP - 8 32/64 бит, в WOW64 и в WinPE работают: тесты создания dir (ЕСЛИ администратор не ковертил взломанный каталог Windows с разрешениями для всех...) и
net session
а также
reg add HKLM /F
чеки.
Кроме того, еще одно замечание в некоторых Windows XP (и, возможно, в других версиях, в зависимости от действий администратора), в зависимости от того, какие записи реестра напрямую вызывают bat/cmd из скрипта.vbs, будет содержать информацию о том, что файлы bat/cmd не связаны ни с чем...
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo
С другой стороны, вызов cmd.exe с параметром файла bat/cmd работает нормально:
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
Вот еще один, чтобы добавить в список;-)
(попытка создания файла в системном расположении)
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
переинициализирует экран и подавляет любой текст / ошибки, если у них нет разрешения на запись в системную папку.
Буквально десятки ответов на этот и связанные вопросы и в других местах в 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;
}
1 MSDN утверждает, что API - это XP+, но это неверно. CheckTokenMembership
это 2k+, а другой еще старше. Последняя ссылка также содержит гораздо более сложный способ, который будет работать даже в NT.
@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...
Альтернатива: используйте внешнюю утилиту, разработанную для этой цели, например, IsAdmin.exe (неограниченное бесплатное программное обеспечение).
Коды выхода:
0 - текущий пользователь не является членом группы администраторов
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 ::::::
Я думаю, что самый простой способ - попытаться изменить системную дату (для этого требуются права администратора):
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
: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
Я объясню код построчно:
@echo off
Пользователи будут раздражены более чем 1 строк без этого.
:start
Точка, где начинается программа.
set randname=%random%%random%%random%%random%%random%
Установите имя файла каталога, который будет создан.
md \windows\%randname% 2>nul
Создает каталог на <DL>:\Windows
(замените
- буквой диска).
if %errorlevel%==0 (echo You're elevated!!!
goto end)
Если переменная окружения ERRORLEVEL равна нулю, то выводится сообщение об успехе.
Идите до конца (не продолжайте дальше).
if %errorlevel%==1 (echo You're not elevated :(:(
goto end)
Если ERRORLEVEL равен единице, выведите сообщение об ошибке и перейдите к концу.
goto start
Если имя файла уже существует, заново создайте папку (в противном случае goto end
команда не даст этому бежать).
:end
Укажите конечную точку
rd \windows\%randname% 2>nul
Удалить созданный каталог.
pause >nul
Пауза, чтобы пользователь мог видеть сообщение.
Примечание: >nul
а также 2>nul
фильтруют вывод этих команд.
net user %username% >nul 2>&1 && echo admin || echo not admin
Вот мои 2 копейки стоит:
Мне нужен был пакет для запуска в среде домена во время процесса входа пользователя, в среде "рабочей комнаты", чтобы пользователи придерживались политики "блокировки" и ограниченного просмотра (в основном, распространяемого через наборы объектов групповой политики).
Набор объектов групповой политики домена применяется до того, как связанный с пользователем сценарий входа в систему A D Создание сценария входа в объект групповой политики было слишком зрелым, поскольку "новый" профиль пользователя не был создан / загружен / или не был готов вовремя применить "удалить и / или Закрепить панель задач и меню "Пуск" vbscript + добавить несколько локальных файлов.
Например: предлагаемая среда профиля 'default-user' требует ярлыка ".URL" (.lnk), помещенного в "%ProgramData%\Microsoft\Windows\Start Menu\Programs*MyNewOWA.url*" и "C: Местоположения \Users\Public\Desktop\*MyNewOWA.url*", среди прочих
Пользователи имеют несколько компьютеров в домене, где только эти установленные ПК "рабочей комнаты" требуют этих политик.
Этим папкам требуются права "Администратор" для изменения, и хотя "Пользователь домена" является частью локальной группы "Администратор" - UAC был следующей проблемой.
Найдены различные приспособления и объединены здесь. У меня есть пользователи с устройствами BYOD, которым требуются другие файлы с проблемами с разрешением. Не тестировал на XP (слишком старая ОС), но код присутствует, хотел бы получить обратную связь.
:: ------------------------------------------------------------------------
:: You have a royalty-free right to use, modify, reproduce and distribute
:: the Sample Application Files (and/or any modified version) in any way
:: you find useful, provided that you agree that the author provides
:: no warranty, obligations or liability for any Sample Application Files.
:: ------------------------------------------------------------------------
:: ********************************************************************************
::* Sample batch script to demonstrate the usage of RunAs.cmd
::*
::* File: RunAs.cmd
::* Date: 12/10/2013
::* Version: 1.0.2
::*
::* Main Function: Verifies status of 'bespoke' Scripts ability to 'Run As - Admin'
::* elevated privileges and without UAC prompt
::*
::* Usage: Run RunAs.cmd from desired location
::* Bespoke.cmd will be created and called from C:\Utilities location
::* Choose whether to delete the script after its run by removing out-comment
::* (::) before the 'Del /q Bespoke.cmd' command
::*
::* Distributed under a "GNU GPL" type basis.
::*
::* Revisions:
::* 1.0.0 - 08/10/2013 - Created.
::* 1.0.1 - 09/10/2013 - Include new path creation.
::* 1.0.2 - 12/10/2013 - Modify/shorten UAC disable process for Admins
::*
::* REFERENCES:
::* Sample "*.inf" secpol.msc export from Wins 8 x64 @ bottom,
::* Would be default but for 'no password complexities'
::*
::* To recreate UAC default:
::* Goto:Secpol, edit out Exit, modify .inf set, export as "Wins8x64.inf"
::* and import using secedit cmd provided
::*
:: ********************************************************************************
@echo off & cls
color 9F
Title RUN AS
Setlocal
:: Verify local folder availability for script
IF NOT EXIST C:\Utilities (
mkdir C:\Utilities & GOTO:GenBatch
) ELSE (
Goto:GenBatch
)
:GenBatch
c:
cd\
cd C:\Utilities
IF NOT EXIST C:\Utilities\Bespoke.cmd (
GOTO:CreateBatch
) ELSE (
Goto:RunBatch
)
:CreateBatch
Echo. >Bespoke.cmd
Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
Echo :: You have a royalty-free right to use, modify, reproduce and distribute >>Bespoke.cmd
Echo :: the Sample Application Files (and/or any modified version) in any way >>Bespoke.cmd
Echo :: you find useful, provided that you agree that the author provides >>Bespoke.cmd
Echo :: has no warranty, obligations or liability for any Sample Application Files. >>Bespoke.cmd
Echo :: ------------------------------------------------------------------------ >>Bespoke.cmd
Echo. >>Bespoke.cmd
Echo :: ******************************************************************************** >>Bespoke.cmd
Echo ::* Sample batch script to demonstrate the usage of Bespoke.cmd >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* File: Bespoke.cmd >>Bespoke.cmd
Echo ::* Date: 10/10/2013 >>Bespoke.cmd
Echo ::* Version: 1.0.1 >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Main Function: Allows for running of Bespoke batch with elevated rights and no future UAC 'pop-up' >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Usage: Called and created by RunAs.cmd run from desired location >>Bespoke.cmd
Echo ::* Found in the C:\Utilities folder >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Distributed under a "GNU GPL" type basis. >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Revisions: >>Bespoke.cmd
Echo ::* 1.0.0 - 09/10/2013 - Created. >>Bespoke.cmd
Echo ::* 1.0.1 - 10/10/2013 - Modified, added ability to temp disable UAC pop-up warning. >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* REFERENCES: >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Exit code (%%^ErrorLevel%%) 0 - No errors have occurred, i.e. immediate previous command ran successfully >>Bespoke.cmd
Echo ::* Exit code (%%^ErrorLevel%%) 1 - Errors occurred, i.e. immediate previous command ran Unsuccessfully >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* MS OS version check >>Bespoke.cmd
Echo ::* http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833%28v=vs.85%29.aspx >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Copying to certain folders and running certain apps require elevated perms >>Bespoke.cmd
Echo ::* Even with 'Run As ...' perms, UAC still pops up. >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* To run a script or application in the Windows Shell >>Bespoke.cmd
Echo ::* http://ss64.com/vb/shellexecute.html >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo ::* Machines joined to a corporate Domain should have the UAC feature set from, and >>Bespoke.cmd
Echo ::* pushed out from a DC GPO policy >>Bespoke.cmd
Echo ::* e.g.: 'Computer Configuration - Policies - Windows Settings - Security Settings - >>Bespoke.cmd
Echo ::* Local Policies/Security Options - User Account Control - >>Bespoke.cmd
Echo ::* Policy: User Account Control: Behavior of the elevation prompt for administrators >>Bespoke.cmd
Echo ::* in Admin Approval Mode Setting: Elevate without prompting >>Bespoke.cmd
Echo ::* >>Bespoke.cmd
Echo :: ******************************************************************************** >>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo @Echo off ^& cls>>Bespoke.cmd
Echo color 9F>>Bespoke.cmd
Echo Title RUN AS ADMIN>>Bespoke.cmd
Echo Setlocal>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo Set "_OSVer=">>Bespoke.cmd
Echo Set "_OSVer=UAC">>Bespoke.cmd
Echo VER ^| FINDSTR /IL "5." ^>NUL>>Bespoke.cmd
Echo IF %%^ErrorLevel%%==0 SET "_OSVer=PreUAC">>Bespoke.cmd
Echo IF %%^_OSVer%%==PreUAC Goto:XPAdmin>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo :: Check if machine part of a Domain or within a Workgroup environment >>Bespoke.cmd
Echo Set "_DomainStat=">>Bespoke.cmd
Echo Set "_DomainStat=%%USERDOMAIN%%">>Bespoke.cmd
Echo If /i %%^_DomainStat%% EQU %%^computername%% (>>Bespoke.cmd
Echo Goto:WorkgroupMember>>Bespoke.cmd
Echo ) ELSE (>>Bespoke.cmd
Echo Set "_DomainStat=DomMember" ^& Goto:DomainMember>>Bespoke.cmd
Echo )>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo :WorkgroupMember>>Bespoke.cmd
Echo :: Verify status of Secpol.msc 'ConsentPromptBehaviorAdmin' Reg key >>Bespoke.cmd
Echo reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin ^| Find /i "0x0">>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo If %%^ErrorLevel%%==0 (>>Bespoke.cmd
Echo Goto:BespokeBuild>>Bespoke.cmd
Echo ) Else (>>Bespoke.cmd
Echo Goto:DisUAC>>Bespoke.cmd
Echo )>>Bespoke.cmd
Echo :DisUAC>>Bespoke.cmd
Echo :XPAdmin>>Bespoke.cmd
Echo :DomainMember>>Bespoke.cmd
Echo :: Get ADMIN Privileges, Start batch again, modify UAC ConsentPromptBehaviorAdmin reg if needed >>Bespoke.cmd
Echo ^>nul ^2^>^&1 ^"^%%^SYSTEMROOT%%\system32\cacls.exe^"^ ^"^%%^SYSTEMROOT%%\system32\config\system^">>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo IF ^'^%%^Errorlevel%%^'^ NEQ '0' (>>Bespoke.cmd
Echo echo Set objShell = CreateObject^^("Shell.Application"^^) ^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
Echo echo objShell.ShellExecute ^"^%%~s0^"^, "", "", "runas", 1 ^>^> ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
Echo ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
Echo del ^"^%%^temp%%\getadmin.vbs^">>Bespoke.cmd
Echo exit /B>>Bespoke.cmd
Echo ) else (>>Bespoke.cmd
Echo pushd ^"^%%^cd%%^">>Bespoke.cmd
Echo cd /d ^"^%%~dp0^">>Bespoke.cmd
Echo @echo off>>Bespoke.cmd
Echo )>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo IF %%^_OSVer%%==PreUAC Goto:BespokeBuild>>Bespoke.cmd
Echo IF %%^_DomainStat%%==DomMember Goto:BespokeBuild>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f>>Bespoke.cmd
Echo.>>Bespoke.cmd
Echo :BespokeBuild>>Bespoke.cmd
Echo :: Add your script requiring elevated perm and no UAC below: >>Bespoke.cmd
Echo.>>Bespoke.cmd
:: PROVIDE BRIEF EXPLINATION AS TO WHAT YOUR SCRIPT WILL ACHIEVE
Echo ::
:: ADD THE "PAUSE" BELOW ONLY IF YOU SET TO SEE RESULTS FROM YOUR SCRIPT
Echo Pause>>Bespoke.cmd
Echo Goto:EOF>>Bespoke.cmd
Echo :EOF>>Bespoke.cmd
Echo Exit>>Bespoke.cmd
Timeout /T 1 /NOBREAK >Nul
:RunBatch
call "Bespoke.cmd"
:: Del /F /Q "Bespoke.cmd"
:Secpol
:: Edit out the 'Exit (rem or ::) to run & import default wins 8 security policy provided below
Exit
:: Check if machine part of a Domain or within a Workgroup environment
Set "_DomainStat="
Set _DomainStat=%USERDOMAIN%
If /i %_DomainStat% EQU %computername% (
Goto:WorkgroupPC
) ELSE (
Echo PC Member of a Domain, Security Policy determined by GPO
Pause
Goto:EOF
)
:WorkgroupPC
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
Echo.
If %ErrorLevel%==0 (
Echo Machine already set for UAC 'Prompt'
Pause
Goto:EOF
) else (
Goto:EnableUAC
)
:EnableUAC
IF NOT EXIST C:\Utilities\Wins8x64Def.inf (
GOTO:CreateInf
) ELSE (
Goto:RunInf
)
:CreateInf
:: This will create the default '*.inf' file and import it into the
:: local security policy for the Wins 8 machine
Echo [Unicode]>>Wins8x64Def.inf
Echo Unicode=yes>>Wins8x64Def.inf
Echo [System Access]>>Wins8x64Def.inf
Echo MinimumPasswordAge = ^0>>Wins8x64Def.inf
Echo MaximumPasswordAge = ^-1>>Wins8x64Def.inf
Echo MinimumPasswordLength = ^0>>Wins8x64Def.inf
Echo PasswordComplexity = ^0>>Wins8x64Def.inf
Echo PasswordHistorySize = ^0>>Wins8x64Def.inf
Echo LockoutBadCount = ^0>>Wins8x64Def.inf
Echo RequireLogonToChangePassword = ^0>>Wins8x64Def.inf
Echo ForceLogoffWhenHourExpire = ^0>>Wins8x64Def.inf
Echo NewAdministratorName = ^"^Administrator^">>Wins8x64Def.inf
Echo NewGuestName = ^"^Guest^">>Wins8x64Def.inf
Echo ClearTextPassword = ^0>>Wins8x64Def.inf
Echo LSAAnonymousNameLookup = ^0>>Wins8x64Def.inf
Echo EnableAdminAccount = ^0>>Wins8x64Def.inf
Echo EnableGuestAccount = ^0>>Wins8x64Def.inf
Echo [Event Audit]>>Wins8x64Def.inf
Echo AuditSystemEvents = ^0>>Wins8x64Def.inf
Echo AuditLogonEvents = ^0>>Wins8x64Def.inf
Echo AuditObjectAccess = ^0>>Wins8x64Def.inf
Echo AuditPrivilegeUse = ^0>>Wins8x64Def.inf
Echo AuditPolicyChange = ^0>>Wins8x64Def.inf
Echo AuditAccountManage = ^0>>Wins8x64Def.inf
Echo AuditProcessTracking = ^0>>Wins8x64Def.inf
Echo AuditDSAccess = ^0>>Wins8x64Def.inf
Echo AuditAccountLogon = ^0>>Wins8x64Def.inf
Echo [Registry Values]>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SecurityLevel=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Setup\RecoveryConsole\SetCommand=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\CachedLogonsCount=1,"10">>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ForceUnlockLogon=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\PasswordExpiryWarning=4,5>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\ScRemoveOption=1,"0">>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin=4,5>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorUser=4,3>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableCAD=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\DontDisplayLastUserName=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableInstallerDetection=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableSecureUIAPaths=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableUIADesktopToggle=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\EnableVirtualization=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\FilterAdministratorToken=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeCaption=1,"">>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\LegalNoticeText=7,>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\PromptOnSecureDesktop=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ScForceOption=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ShutdownWithoutLogon=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\UndockWithoutLogon=4,1>>Wins8x64Def.inf
Echo MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ValidateAdminCodeSignatures=4,^0>>Wins8x64Def.inf
Echo MACHINE\Software\Policies\Microsoft\Windows\Safer\CodeIdentifiers\AuthenticodeEnabled=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\AuditBaseObjects=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\CrashOnAuditFail=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\DisableDomainCreds=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\EveryoneIncludesAnonymous=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\FullPrivilegeAuditing=3,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\LimitBlankPasswordUse=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinClientSec=4,536870912>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\MSV1_0\NTLMMinServerSec=4,536870912>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\NoLMHash=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymous=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Lsa\RestrictAnonymousSAM=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan Print Services\Servers\AddPrinterDrivers=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedExactPaths\Machine=7,System\CurrentControlSet\Control\ProductOptions,System\CurrentControlSet\Control\Server Applications,Software\Microsoft\Windows NT\CurrentVersion>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\SecurePipeServers\Winreg\AllowedPaths\Machine=7,System\CurrentControlSet\Control\Print\Printers,System\CurrentControlSet\Services\Eventlog,Software\Microsoft\OLAP Server,Software\Microsoft\Windows NT\CurrentVersion\Print,Software\Microsoft\Windows NT\CurrentVersion\Windows,System\CurrentControlSet\Control\ContentIndex,System\CurrentControlSet\Control\Terminal Server,System\CurrentControlSet\Control\Terminal Server\UserConfig,System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration,Software\Microsoft\Windows NT\CurrentVersion\Perflib,System\CurrentControlSet\Services\SysmonLog>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Kernel\ObCaseInsensitive=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\ClearPageFileAtShutdown=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Session Manager\ProtectionMode=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\optional=7,Posix>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect=4,15>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableForcedLogOff=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\EnableSecuritySignature=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\NullSessionPipes=7,>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\RestrictNullSessAccess=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnablePlainTextPassword=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\EnableSecuritySignature=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters\RequireSecuritySignature=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\LDAP\LDAPClientIntegrity=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,^0>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\MaximumPasswordAge=4,30>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireSignOrSeal=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\RequireStrongKey=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SealSecureChannel=4,1>>Wins8x64Def.inf
Echo MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\SignSecureChannel=4,1>>Wins8x64Def.inf
Echo [Privilege Rights]>>Wins8x64Def.inf
Echo SeNetworkLogonRight = *S-1-1-0,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
Echo SeBackupPrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
Echo SeChangeNotifyPrivilege = *S-1-1-0,*S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551,*S-1-5-90-^0>>Wins8x64Def.inf
Echo SeSystemtimePrivilege = *S-1-5-19,*S-1-5-32-544>>Wins8x64Def.inf
Echo SeCreatePagefilePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeDebugPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeRemoteShutdownPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeAuditPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
Echo SeIncreaseQuotaPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544>>Wins8x64Def.inf
Echo SeIncreaseBasePriorityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeLoadDriverPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeBatchLogonRight = *S-1-5-32-544,*S-1-5-32-551,*S-1-5-32-559>>Wins8x64Def.inf
Echo SeServiceLogonRight = *S-1-5-80-0,*S-1-5-83-^0>>Wins8x64Def.inf
Echo SeInteractiveLogonRight = Guest,*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
Echo SeSecurityPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeSystemEnvironmentPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeProfileSingleProcessPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeSystemProfilePrivilege = *S-1-5-32-544,*S-1-5-80-3139157870-2983391045-3678747466-658725712-1809340420>>Wins8x64Def.inf
Echo SeAssignPrimaryTokenPrivilege = *S-1-5-19,*S-1-5-20>>Wins8x64Def.inf
Echo SeRestorePrivilege = *S-1-5-32-544,*S-1-5-32-551>>Wins8x64Def.inf
Echo SeShutdownPrivilege = *S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551>>Wins8x64Def.inf
Echo SeTakeOwnershipPrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeDenyNetworkLogonRight = Guest>>Wins8x64Def.inf
Echo SeDenyInteractiveLogonRight = Guest>>Wins8x64Def.inf
Echo SeUndockPrivilege = *S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
Echo SeManageVolumePrivilege = *S-1-5-32-544>>Wins8x64Def.inf
Echo SeRemoteInteractiveLogonRight = *S-1-5-32-544,*S-1-5-32-555>>Wins8x64Def.inf
Echo SeImpersonatePrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
Echo SeCreateGlobalPrivilege = *S-1-5-19,*S-1-5-20,*S-1-5-32-544,*S-1-5-6>>Wins8x64Def.inf
Echo SeIncreaseWorkingSetPrivilege = *S-1-5-32-545,*S-1-5-90-^0>>Wins8x64Def.inf
Echo SeTimeZonePrivilege = *S-1-5-19,*S-1-5-32-544,*S-1-5-32-545>>Wins8x64Def.inf
Echo SeCreateSymbolicLinkPrivilege = *S-1-5-32-544,*S-1-5-83-^0>>Wins8x64Def.inf
Echo [Version]>>Wins8x64Def.inf
Echo signature="$CHICAGO$">>Wins8x64Def.inf
Echo Revision=1>>Wins8x64Def.inf
:RunInf
:: Import 'Wins8x64Def.inf' with ADMIN Privileges, to modify UAC ConsentPromptBehaviorAdmin reg
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%%\system32\config\system"
IF '%Errorlevel%' NEQ '0' (
echo Set objShell = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo objShell.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
Goto:CheckUAC
) else (
Secedit /configure /db secedit.sdb /cfg C:\Utilities\Wins8x64Def.inf /overwrite
@echo off
)
:CheckUAC
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v ConsentPromptBehaviorAdmin | Find /i "0x5"
Echo.
If %ErrorLevel%==0 (
Echo ConsentPromptBehaviorAdmin set to 'Prompt'
Pause
Del /Q C:\Utilities\Wins8x64Def.inf
Goto:EOF
) else (
Echo ConsentPromptBehaviorAdmin NOT set to default
Pause
)
ENDLOCAL
:EOF
Exit
Доменные ПК должны в максимально возможной степени регулироваться наборами объектов групповой политики. Рабочая группа / Автономные машины могут управляться этим сценарием.
Помните, что приглашение UAC будет всплывать как минимум один раз на ПК рабочей группы BYOD (как только потребуется первое повышение до "Административные привилегии"), но, поскольку с этого момента локальная политика безопасности изменяется для использования администратором, всплывающие окна исчезнут.
На доменном ПК должна быть политика GPO "ConsentPromptBehaviorAdmin", установленная в вашей "уже" созданной политике "блокировки" - как объяснено в разделе "Ссылки" сценария.
Опять же, запустите импорт secedit.exe из файла.inf по умолчанию, если вы застряли во всей дискуссии "В UAC или не в UAC":-).
кстати: @boileau Проверьте свою неудачу на:
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
Запустив только "%SYSTEMROOT%\system32\cacls.exe" или "%SYSTEMROOT%\system32\config\system" или оба из командной строки - с повышенными правами или нет, проверьте результат по всем направлениям.
Еще один способ сделать это.
REM # # # # CHECKING OR IS STARTED AS ADMINISTRATOR # # # # #
FSUTIL | findstr /I "volume" > nul&if not errorlevel 1 goto Administrator_OK
cls
echo *******************************************************
echo *** R U N A S A D M I N I S T R A T O R ***
echo *******************************************************
echo.
echo.
echo Call up just as the Administrator. Abbreviation can be done to the script and set:
echo.
echo Shortcut ^> Advanced ^> Run as Administrator
echo.
echo.
echo Alternatively, a single run "Run as Administrator"
echo or in the Schedule tasks with highest privileges
pause > nul
goto:eof
:Administrator_OK
REM Some next lines code ...