Пакет script: как проверить права администратора

Как проверить, имеет ли текущий пакет script права администратора?

Я знаю, как заставить его вызвать себя с runas, но не как проверить права администратора. Единственные решения, которые я видел, - это грубые взлома или использование внешних программ. Ну, на самом деле мне все равно, если это хакерская работа, пока она работает на Windows XP и новее.

Ответ 1

Вопросы

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 - стандартная команда, используемая "управлять подключениями к серверному компьютеру. Используется без параметров, [it] отображает информацию обо всех сеансах с локальным компьютером."

Итак, вот основной процесс моей данной реализации:

  • @echo off
    • Отключить отображение команд
  • goto check_Permissions
    • Перейти к блоку :check_Permissions
  • net session >nul 2>&1
    • Запустить команду
    • Скрыть визуальный вывод команды
      • Перенаправление потока стандартного вывода (числовой дескриптор 1/ STDOUT) в nul
      • Перенаправление стандартного потока вывода ошибок (числовой дескриптор 2/ STDERR) в тот же пункт назначения, что и числовой дескриптор 1
  • if %errorLevel% == 0
    • Если значение кода выхода (%errorLevel%) равно 0, то это означает, что не было ошибок, и, следовательно, была запущена немедленная предыдущая команда успешно
  • else
    • Если значение кода выхода (%errorLevel%) не 0, то это означает, что произошли ошибки, и, следовательно, была запущена немедленная предыдущая команда безуспешно
  • Код между соответствующей скобкой будет выполняться в зависимости от того, какие критерии выполнены.

 

Скриншоты

Windows 8 AT %errorLevel%:

[imgur]

 

NET SESSION в Windows XP x86 - Windows 8 x64:

[imgur]

 

Спасибо, @Тилка, за то, что вы изменили свой принятый ответ на мой вопрос.:)

Ответ 2

Решение Anders работало для меня, но я не был уверен, как инвертировать его, чтобы получить обратное (когда вы не администратор).

Вот мое решение. У этого есть два случая случай 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 бит).

EDIT: 8/28/2012 Обновлен для поддержки Windows 8. @BenHooper указал на это в своем ответе ниже. Пожалуйста, поддержите его ответ.

Ответ 3

Дополнительные проблемы

Как указано @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 Vista для Windows, и я начал прокручивать список приложений в папке C:\Windows\System32, пытаясь получить некоторые идеи. После испытаний и ошибок, это грязный (каламбур) подход, который я придумал:

fsutil dirty query %systemdrive% >nul

Для команды fsutil dirty требуются права администратора, и в противном случае она не удастся. %systemdrive% является переменной окружения, которая возвращает букву диска, в которой установлена ​​операционная система. Выход перенаправляется на nul, поэтому игнорируется. Переменная %errorLevel% будет установлена ​​на 0 только после успешного выполнения.

Вот что говорится в документации:

Fsutil dirty

Запросит или установит бит с уровнем громкости. Когда установлен объемный бит, autochk автоматически проверяет громкость на наличие ошибок при следующем перезапуске компьютера.

Синтаксис

fsutil dirty {query | set} <VolumePath>

Параметры

query           Queries the specified volume dirty bit.
set             Sets the specified volume 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 Vista​​li >
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE

Ответ 4

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)

Ответ 5

еще один способ

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
)

Ответ 6

альтернативное решение:

@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

Ответ 7

Не только проверка, но и автоматическое получение прав администратора
aka Automatic UAC for Win 7/8/8.1 ff.
. Ниже приведено замечательное приложение с еще одной функцией: этот пакетный фрагмент не только проверяет права администратора, но и автоматически получает его! (и тесты раньше, если они живут на ОС, совместимой с 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" я просто не нашел ссылку.)

(Что касается некоторых очень незначительных ограничений, когда "NET SESSION" не работает, как указано в другом ответе, не стесняйтесь вставлять еще одну из этих команд. Для меня запуск в безопасном режиме Windows или специальных стандартных сервисах вниз и т.д. важные случаи использования - для некоторых администраторов, возможно, они есть.)

Ответ 8

У меня есть два способа проверки привилегированного доступа, оба они довольно надежны и очень переносимы практически для каждой версии 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, но если вы запустите его как Admin, он будет печатать "команда выполнена успешно" и ERRORLEVEL == 0. Поскольку ключ уже существует, он не влияет на реестр. Это, вероятно, самый быстрый способ, и REG существует в течение длительного времени.

* Это не доступно для pre NT (Win 9X).

* Работает на XP и позже


Рабочий пример

A script, которые очищают временную папку

@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

Ответ 9

Следующее пытается создать файл в каталоге 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, который был создан сегодня, и предполагается, что он не может конфликтовать с существующим именем файла.

Ответ 10

Самый чистый способ проверить права администратора с помощью CMD script, который я нашел, выглядит примерно так:

@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. Обычные пользовательские процессы или отдельные процессы выходят из строя с помощью зонда каталога, где в случае успешного администрирования или повышенных процессов.

Ответ 11

Группы 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 перед рукой, вы получите неверную информацию.

Ответ 12

whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)

Ответ 13

Некоторые серверы отключают службы, требуемые командой "net session". Это приводит к проверке администратора всегда, говоря, что у вас нет прав администратора, когда вы можете иметь.

Ответ 14

Изменить: copyitright указала, что это ненадежно. Утверждение доступа к чтению с помощью UAC позволит директору добиться успеха. У меня есть немного больше script, чтобы предложить другую возможность, но она не доступна только для чтения.

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

Немного зависимостей и быстрых.

Ответ 15

Примечание: Проверка с помощью 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 to 7 протестирован, однако он не работает в WinPE, как в Windows 7 install.wim нет таких файлов dir и cacls.exe

Также в winPE И wow64 не удается проверить с помощью openfiles.exe:

OPENFILES > nul

В Windows 7 он будет errorlevel с "1" с информацией о том, что "целевой системой должна быть 32-разрядная операционная система"

Обе проверки, вероятно, также потерпят неудачу в консоли восстановления.

Что работает в Windows XP - 8 32/64 бит, в WOW64 и в WinPE: тесты создания dir (IF admin не ковер бомбил каталог Windows с разрешениями для всех...) и

net session

и

reg add HKLM /F

проверки.

Также еще одно примечание в некоторых Windows XP (и в других версиях, возможно, тоже, в зависимости от администрирования) в зависимости от записей реестра, напрямую вызывающих bat/cmd из .vbs script, не будет с информацией о том, что файлы 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

Ответ 16

Буквально десятки ответов на эти и связанные вопросы и в других местах в SE, все из которых так или иначе несовершенны, ясно показали, что Windows не предоставляет надежную встроенную консольную утилиту. Итак, пришло время развернуть свои собственные.

Следующий код на основе Обнаружение, если программа запущена с полными правами администратора, работает в 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.

Ответ 17

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"
    }
}

Ответ 18

Вот еще один, который нужно добавить в список; -)

(попытка создания файла в системном расположении)

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 повторно инициализирует экран и подавляет любые текст/ошибки, если у вас нет разрешения на запись в расположение системы.

Ответ 19

В пакетном скрипте, который я написал для получения прав администратора, я сделал это следующим образом:

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

Это проверено для Windows 7, 8, 8.1, 10 и даже Windows XP и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра.

Ответ 20

Альтернатива: используйте внешнюю утилиту, предназначенную для этой цели, например IsAdmin.exe (неограниченное бесплатное ПО).

Коды выхода:

0 - Текущий пользователь не является членом группы "Администраторы"

1 - Текущий пользователь Administrators и работает с повышенными

2 - Текущий пользователь Administrators, но не работает приподнятый

Ответ 21

@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...

Ответ 22

@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 (замените <DL> буквой диска).

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 фильтруют вывод этих команд.

Ответ 23

net user %username% >nul 2>&1 && echo admin || echo not admin

Ответ 24

Я нашел пользователя, который может использовать 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 ::::::

Ответ 25

Я думаю, что самый простой способ - это изменить системную дату (для которой требуются права администратора):

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 ...

Ответ 26

Здесь мои 2-фунтовые достоинства:

Мне понадобилась партия для работы в среде домена во время процесса входа в систему, в среде "workroom", когда пользователи придерживались политики "блокировки" и ограниченного представления (в основном распределенные с помощью наборов объектов групповой политики).

Набор GPO домена применяется до того, как пользователь, подключенный к AD, войдет в систему script Создание входа в GPO script было слишком зрелым, поскольку пользовательский "новый" профиль не был создан/загружен/или не был готов вовремя, чтобы применить панель задач "удалить и/или Pin" и элементы меню "Пуск" vbscript + добавить некоторые локальные файлы.

Например: предлагаемая среда профиля профиля "по умолчанию" требует ярлыка ".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

Домен ПК должен управляться как можно больше с помощью наборов объектов групповой политики. Рабочие группы/автономные машины могут управляться этим script.

Помните, что приглашение UAC будет выходить по крайней мере один раз на ПК рабочей группы BYOD (как только требуется первое повышение до "Перманент администратора" ), но по мере того, как локальная политика безопасности изменяется для использования администратором с этой точки on, всплывающие окна исчезнут.

Домен ПК должен иметь политику GPO "ConsentPromptBehaviorAdmin", установленную в вашей уже "созданной" политике "блокировки", как описано в разделе script "ССЫЛКИ".

Опять же, запустите импорт 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" или оба из командной строки - повышенные или нет, проверьте результат по всей доске.

Ответ 27

Другой способ сделать это.

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 ...