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

281

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

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

flacs
источник
2
после того, как вы можете изменить право: [Как запросить доступ администратора внутри пакетного файла] [1] [1]: stackoverflow.com/questions/1894967/…
Alban
См. Также: superuser.com/questions/667607/…
ivan_pozdeev

Ответы:

466

вопросы

Решение 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
  • Windows 10 v1909, 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это стандартная команда, используемая для «управления подключениями к компьютеру. Используется без параметров, [она] отображает информацию обо всех сеансах с локальным компьютером».

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

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

 

Скриншоты

Windows 8AT %errorLevel% :

[Imgur]

 

NET SESSIONв Windows XP x86 - Windows 8 x64 :

[Imgur]

 

Спасибо, @Tilka, за изменение принятого ответа на мой. :)

мифофешелона
источник
13
+1 Отличная работа! Хорошее исследование. Ваш пост должен быть новым принятым ответом.
blak3r
13
Это решение обычно прекрасно работает, но если служба «Сервер» (LanmanServer) остановлена, код ошибки «Служба сервера не был запущен» - это тот же код ошибки, что и для «Доступ запрещен», что приводит к ложному отрицанию , Другими словами, есть случаи, когда вы можете выполнить эту проверку с правами администратора, и она выдаст ту же ошибку, что и без этих привилегий.
Лектрод
3
@Lectrode Я опубликовал альтернативное решение, которое не имеет такой же проблемы: stackoverflow.com/questions/4051883/…
and31415
8
Этот код возвращает ложное срабатывание (по крайней мере, в Windows 7), если пользователь является опытным пользователем. Опытный пользователь также может «поднять» и затем net sessionуспешно работать (ERRORLEVEL = 0), но на самом деле он не имеет прав администратора. Использование openfiles(см. Ответ Лукреция ниже) не имеет этой проблемы.
EM0
1
При этом выводится сообщение, если сетевое устройство не работает полностью (например, отладка Windows). fltmc> nul 2> & 1 работает лучше в этом отношении.
Кевинф
80

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

Вот мое решение. У него есть два случая 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 указал на это в своем ответе ниже. Пожалуйста, подтвердите его ответ.

blak3r
источник
1
ATне работает на Windows 8, но я нашел лучшее решение. На самом деле я разместил это как ответ здесь: stackoverflow.com/questions/4051883/… (или вы можете просто прокрутить вниз, что угодно).
Мифофешелон
1
Интересно, если две строки if% errorLevel% == / EQU в первом блоке кода - это TYPO ... пожалуйста, исправьте.
Уджвал Сингх
@UjjwalSingh Это точно было. Спасибо за ловлю. Я обновил это.
blak3r
Возможно, вы захотите заменить «Rushyo опубликовал это решение здесь» вашим комментарием обо мне сейчас, когда вы используете мое решение? :)
Мифофешелон
Не работает для группы администраторов домена, добавленной в группу администраторов на локальном компьютере, и войдите в систему с правами администратора домена.
MCRohith
46

Больше вопросов

Как указывает @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
and31415
источник
1
+1 Отличные решения. В частности, решение SFC является надежной проверкой для всех рассматриваемых операционных систем. Если я столкнусь с какими-либо проблемами, используя одну из них, я сообщу о них здесь.
Lectrode
1
Любой, кто хочет использовать SFCчек для всех систем, должен проявить творческий подход. По какой-то причине, начиная с Windows 8, SFCвыводится только один символ. Чтобы успешно проанализировать вывод, вам нужно сделать следующее: setlocal enabledelayedexpansion for /f "tokens=* delims=" %%s in ('sfc 2^>^&1^|MORE') do @set "output=!output!%%s" echo "%output%"|findstr /I /C:"/scannow">nul 2>&1(3 отдельные строки). Это должно работать на Windows 2000 через Windows 2012 R2. Кстати, я предпочитаю FINDSTR, потому что он обычно обрабатывает вещи быстрее, чем FIND.
Lectrode
Отличная работа, @ and31415! Я лично еще не тестировал ваше fsutilрешение, но, насколько я вижу, оно кажется гораздо более гибким, чем мое решение. Хотя, возможно, не так элегантно. ;) Я рад видеть, что между нами мы получаем отличное, простое и гибкое решение для обнаружения администраторов. :)
Мифофешелон
1
При запуске FSUTIL вы можете не указывать букву диска и просто запускать ее с fsutil dirty query >nulповышенными правами, это возвращает текст справки и% errorlevel% = 0
SS64
4
@ ss64 Windows 10 больше не возвращает ненулевой уровень ошибки для fsutil dirty query >nul, однако fsutil dirty query %systemdrive% >nulвсе еще работает
bcrist
19

еще два способа - быстрый и обратно совместимый.

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

fltmc Команда доступна в любой системе Windows начиная с XP, поэтому она должна быть довольно переносимой.


Еще один очень быстрое решение проверено на XP, 8.1, 7 - есть одна конкретная переменная , =::которая представлена только в случае , если сеанс консоли не имеет администратора privileges.As это не так легко создать переменную , которая содержит =в его имя это сравнительно надежный способ проверки для администратора разрешение (он не вызывает внешние исполняемые файлы, поэтому он работает хорошо)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! ( 
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

Если вы хотите использовать это непосредственно через командную строку, но не из командного файла, вы можете использовать:

set ^"|find "::"||echo has admin permissions
npocmaka
источник
Эпично ... Есть ли у решения "dv == ::" какие-либо недостатки / ограничения?
script'n'code
Ну, почему-то! DV! Метод всегда говорит, что я администратор, хотя я не щелкнул правой кнопкой мыши «Запуск от имени администратора» командного файла (Windows 10). Я действительно думал, что этот метод был безупречен. Мне понравился этот метод, потому что он не зависит от внешних программ. Теперь мне грустно, и я не знаю, что делает его неудачным / ненадежным для меня :(
script'n'code
1
@copyitright - у меня не было машины win10, чтобы проверить ее там :(. Хотя наличие =::переменной - это скорее ошибка - она ​​представляет собой несуществующий диск, поэтому, вероятно, это было исправлено в win10.
npocmaka
Они, вероятно, исправили это да. Это было весело, пока он продолжался.
script'n'code
1
Я вижу, =::что определено для CMD без прав администратора в Windows 10 1709. В любом случае это ненадежный способ, вы можете легко заставить его быть определенным даже на сеансах CMD администратора:subst :: c:\ & for %a in (::) do %a & set,
sst
17
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)
Андерс
источник
1
Кажется, что в некоторых случаях тест всегда не удался, даже после повышения. В моем случае, когда скрипт был вызван моим приложением.
Boileau
15

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

@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
Не могли бы вы добавить объяснение к вашему ответу?
bjb568
4
Хотя этот код может ответить на вопрос, вы должны добавить объяснение, почему это так.
PlasmaHH
2
Да! Это работает правильно, даже если пользователь является опытным пользователем (в отличие от «net session»). Однако нет необходимости в pushd / popd. Достаточно просто запустить openfilesи проверить ERRORLEVEL.
EM0
2
Я использовал это решение, и оно работает хорошо. Проблема в том, что openfiles.exeв WinPE не работает, поэтому сценарий всегда возвращает, что пользователь не является администратором.
Путник
Документацию для openfiles.exe можно найти по адресу technet.microsoft.com/de-de/library/bb490961.aspx . 1>и 2>&1объяснены на microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulотносится к нулевому устройству
user1460043
13

Не только проверка, но и ПОЛУЧЕНИЕ прав администратора автоматически, также
называемое Automatic 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 или специальные стандартные службы не работают, и это не является важным вариантом использования) - для некоторых администраторов, возможно, они есть.)

Philm
источник
Это круто! Обратите внимание на одну вещь - вызов из Visual Basic работает следующим образом start- он открывает скрипт в новом окне. Если вы хотите увидеть результаты - добавьте pauseв конце вашего скрипта. Кроме того, трудно определить, когда мы «остаемся» поднятыми, и когда происходит повторный запуск. Для этого вы можете использовать аргумент командной строки: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Томаш Гандор
@Philm: Что если UAC потребует от пользователя ввести свой пароль? Я предполагаю, что этот код не даст им права администратора автоматически, если пользователь сначала не
введет
@copyitright. Нет, конечно нет. Но если пароль нужен или нет, здесь нет разницы: я имел в виду «автоматически», это то, что сценарий автоматически запускает Windows для запроса прав, не более. Без такой конструкции пакетный скрипт потерпит неудачу, если его запустить двойным щелчком или аналогичным образом. Чтобы избежать этого, пользователь должен заранее знать, что для скрипта требуются повышенные права, и должен был его так запустить.
Филм
Так что мой сценарий просто позволяет автору пакетных файлов сдвигать момент необходимого повышения в точку во время выполнения пакета, которую он или она хочет. Или другими словами: для более удобного выполнения обычным «двойным щелчком». Поскольку я рассматривал такие пакетные файлы, которые обычно используются профессионалами или пользователями с очень хорошим знанием базовых технологий Windows, я не объяснил это подробно.
Филм
12

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


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

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

Vitim.us
источник
1
Мне очень нравится метод реестра. Я действительно могу вспомнить это, не нужно искать это каждый раз, когда я использую это.
Miscreant
8

В пакетном скрипте 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 и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра.

Matt
источник
6

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

Уильям
источник
1
Авторские права указали, что это ненадежно. Если вы посетите% windir% \ system32 \ config \ systemprofile в окне проводника и подтвердите с помощью UAC, окно CMD может успешно изменить содержимое. Привести вас к мысли, что у вас есть возвышение, когда у вас его нет.
Тайлер Сабо
5

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

Benoit
источник
+1, потому что принятый ответ вызвал бесконечное количество окон команд, когда скрипт вызывался из моего приложения.
Boileau
was generated today and it is assumed to be improbable to conflict with an existing filename.кроме тех случаев, когда два человека используют этот код
Vitim.us
4

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

zumalifeguard
источник
whoami /groupsне предоставляет неверную информацию. Просто это runas /trustlevelставит вас в неожиданное положение: работа без прав администратора, но с высоким уровнем целостности. Вы можете подтвердить это с помощью Process Explorer. (Это может быть ошибка в, runasно не ошибка whoami.)
Гарри Джонстон
Гарри, я слышу, что вы говорите, но не могли бы вы уточнить это? Я не понимаю комментарий относительно того, runas /trustlevel когда вы являетесь локальным администратором, а UAC отключен, ввод этой команды runas из командной строки администратора переведет вас в контекст безопасности «базового пользователя». В этом режиме вы не можете выполнять операции администратора. Попробуйте "net session", или fsutil ", или любую другую утилиту, для которой требуется доступ администратора. Однако" whoami / groups "говорит вам, что у вас повышен уровень. Если это не так. Тот факт, что вызов GetTokenInformation возвращает" TokenElevationTypeDefault ", указывает на это.
zumalifeguard
Я не уверен, что понимаю, что вы подразумеваете под "whoami / groups говорит вам, что вы повышены"; он буквально не выводит строку "вы возвышены", не так ли? Какую часть вывода whoami / groups вы смотрите?
Гарри Джонстон
Гарри, я вижу, я не был ясен. Первый фон, так что вы и я на одной странице. Есть несколько хитростей, которые люди используют для определения того, работает ли в настоящий момент командная строка в состоянии с правами администратора. Обычные методы - использовать встроенную команду, такую ​​как fsutil, at, whoami и «net session». Использование "в" не рекомендуется. Если вы будете искать на этой странице, вы увидите примеры с использованием fsutil, whoami и «net session». Смотрите здесь для большего количества примеров whoami: stackoverflow.com/questions/7985755/…
zumalifeguard
Кроме того, использование фразы «работает с повышенными правами» не совсем правильно. Что я (и другие) должен сказать "работает с правами администратора". Если UAC выключен, он просто работает, когда вошел в систему как локальный администратор, но явно не понизил уровень доверия, такой как с runas. Когда UAC включен, это означает, что пользователь работает в режиме с повышенными правами.
zumalifeguard
2
whoami /groups | find "S-1-16-12288" > nul
if not errorlevel 1 (
  echo ...  connected as admin
)
Totonga
источник
2
Проблема здесь в том, что вы проверяете, есть ли у пользователя права администратора. Но пакетный скрипт может работать без прав администратора.
Танаскиус
2
Плюс whoamiне поддерживается в Windows XP.
Мифофешелон
Кроме того, whoami / groups имеет крайний случай, когда вы получаете неверную информацию. См stackoverflow.com/questions/4051883/...
zumalifeguard
2

Некоторые серверы отключают службы, необходимые для команды «net session». В результате проверки администратора всегда говорят, что у вас нет прав администратора, если у вас есть.

Дэн
источник
2

Редактировать: авторское право указало, что это ненадежно. Утверждение доступа для чтения с 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

Мало зависимости и быстро.

Тайлер Сабо
источник
1
Это решение работало для меня, но поскольку я просмотрел местоположение и получил доступ к папке, для которой вам нужны повышенные привилегии, код ошибки / выхода ERRORLEVEL всегда равен 0, несмотря на то, что скрипт запускается как обычный пользователь.
script'n'code
1

Примечание. Проверка с помощью 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 являются: реж тесты создания (IF админ не ковер бомбил каталог ОС 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
user2902818
источник
1

Буквально десятки ответов на этот и связанные вопросы и в других местах в 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.

ivan_pozdeev
источник
1

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"
    }
}
Ostati
источник
1

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

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

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

script'n'code
источник
0

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

Коды выхода:

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

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

2 - текущий пользователь-администратор, но не работает с повышенными правами

Bill_Stewart
источник
0
@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...
CMD
источник
0
@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фильтруют выходные данные этих команд.

EKons
источник
Да, я знаю, что когда вы вошли в систему как пользователь Администратор (не пользователь с типом учетной записи администратора), вы всегда будете повышены, но это не ошибка!
EKons
0

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

еретик
источник
Кажется, что это неправильно, показывает, есть ли у пользователя права администратора, но это не связано с вопросом, запускается ли текущий cmd.exe с правами администратора
jeb
Нет, он показывает, имеет ли текущий cmd.exe административный доступ к базе данных пользователей, или нет, поэтому он работает даже в том случае, если нет «net session». альтернативно, «net config> nul 2> & 1 && echo admin || echo not admin» выполняет эту работу. Обе конструкции успешно протестированы на Windows XP под гостевой, опытным пользователем и административными учетными записями с LanmanServer остановлено (уровень ошибки 2 для cmd.exe запускается под гостевым и опытным пользователем, уровень ошибки 0 для cmd.exe под правами администратора). Будет ли это работать в Vista и позже с вышеупомянутыми проблемами UAC - я не знаю, так что было бы хорошо, если бы кто-то мог проверить это.
еретик
2
Я протестировал с двумя окнами cmd (win7x64), начал с правами администратора и без. В обоих случаях это показываетadmin
Джеб
0

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

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 ...
Aacini
источник
3
Не могу не понизить такой разрушительный «совет».
ivan_pozdeev
2
Даже если оставить в стороне то, что изменение системного времени без веской причины приводит к тому, что вы стреляете себе в ногу (всевозможные странные эффекты в программном обеспечении) - если вы используете текущее время, вы все равно искажаете его к моменту выполнения команды.
ivan_pozdeev
2
@ivan_pozdeev: Возможно, вы могли бы описать только один из «странных эффектов для программного обеспечения», которые могут произойти, когда дата изменяется на ту же дату в сеансе cmd.exe ...
Aacini
1
Также см superuser.com/questions/27263/...
ivan_pozdeev
@ivan_pozdeev: Ни одна из ваших ссылок даже не имеет отношения к моему методу. Я думаю, что вы неправильно поняли мое решение. Этот метод может иметь только один из двух возможных результатов: ничего не изменится (если у пользователя нет прав администратора) или ДАТА будет изменена на ОДНОВРЕМЕННОЕ ЗНАЧЕНИЕ (если у пользователя есть права администратора). Мой метод не меняет время ! Я приглашаю вас перечитать мой ответ и объяснить простым языком причины вашего отрицательного голоса ...:(
Aacini
0

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

Коллекция из четырех, казалось бы, наиболее совместимых методов с этой страницы. Первый действительно гениален. Проверено с XP. Заблуждение, однако, что нет стандартной команды для проверки прав администратора. Я полагаю, что сейчас они просто сосредоточены на PowerShell, который действительно бесполезен для большей части моей собственной работы.

Я вызвал пакет 'exit-if-not-admin.cmd', который можно вызывать из других пакетов, чтобы убедиться, что они не продолжат выполнение, если не предоставлены необходимые права администратора.

rem Sun May 03, 2020

rem Methods for XP+ used herein based on:
rem /programming/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```
risingballs
источник
-1

Вот мои 2 копейки стоит:

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

Набор объектов групповой политики домена применяется до того, как сценарий входа пользователя, связанный с AD, создает сценарий входа объекта групповой политики, который был слишком зрелым, поскольку «новый» профиль пользователя не был создан / загружен / или не был готов вовремя применить «удалить и / или Закрепить панель задач и пункты меню Пуск vbscript + добавить несколько локальных файлов.

Например: для предлагаемой среды профиля «user-default» требуется ярлык «.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" или оба из командной строки - с повышенными правами или нет, проверьте результат по всем направлениям.

Ян Стокдейл
источник
-2

Еще один способ сделать это.

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 ...
Артур Згадзай
источник
Что это за ссылка? Помечен как спам из-за ссылки.
mmgross
Проверьте этот ответ на наличие кода, который проверяет и запрашивает автоматически: stackoverflow.com/a/30590134/4932683
cyberponk