Пакетний сценарій: як перевірити права адміністратора


281

Як перевірити, чи має поточний скрипт права адміністратора?

Я знаю, як змусити його називати себе рунами, але не як перевірити права адміністратора. Єдині рішення, які я бачив, - це сирі хакерські завдання або використання зовнішніх програм. Ну, насправді мені байдуже, чи це хакерська робота, якщо вона працює на Windows XP та новіших версіях.


2
після того, як ви можете змінити право: [Як подати запит на доступ адміністратора до пакетного файлу] [1] [1]: stackoverflow.com/questions/1894967/…
Албан,



Дивіться також: 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.

 

Дослідження

Отже, я пішов шукати інші команди, які потребують підвищених дозволів. Раціональноparanoid.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. Перенаправлення STDOUTпотоку стандартного виводу (числова ручка 1 / ) наnul
      2. Перенаправлення стандартного вихідного потоку помилок (числова ручка 2 / STDERR) на те саме призначення, що і числова ручка 1
  4. if %errorLevel% == 0
    • Якщо значення коду виходу ( %errorLevel%) є, 0 то це означає, що жодних помилок не сталося, а отже, безпосередньо попередня команда успішно виконувалася
  5. else
    • Якщо значення коду виходу ( %errorLevel%) не є, 0 це означає, що сталися помилки і, отже, безпосередньо попередня команда невдало виконувалася
  6. Код між відповідними дужками виконуватиметься залежно від того, яким критеріям відповідає

 

Скріншоти

Windows 8AT %errorLevel% :

[Імгур]

 

NET SESSIONна Windows XP x86 - Windows 8 x64 :

[Імгур]

 

Дякую, @Tilka, що ти змінив свою прийняту відповідь на мою. :)


13
+1 Чудова робота! Хороші дослідження. Ваша публікація заслуговує на нову прийняту відповідь.
blak3r

13
Це рішення зазвичай працює чудово, але якщо послуга "Сервер" (LanmanServer) зупинена, код помилки для "Серверної служби не запущений" - це той самий код помилки, який ви отримуєте для "Доступ відмовлено", що призводить до помилкового негативного . Іншими словами, є випадки, коли ви можете запустити цю перевірку з адміністративними привілеями, і вона поверне ту саму помилку, що і без цих привілеїв.
Lectrode

3
@Lectrode Я відправив альтернативне рішення , яке не має один і той же питання: stackoverflow.com/questions/4051883 / ...
and31415

8
Цей код повертає помилковий позитив (принаймні в Windows 7), якщо користувач Power User. Користувач Power може також "підвищити", а потім net sessionуспішно запуститись (ERRORLEVEL = 0) - але вони фактично не мають прав адміністратора. Використання openfiles(див. Відповідь Лукреція нижче) не має цієї проблеми.
EM0

1
Це висить підказку, якщо мережевий пристрій працює не повністю (наприклад: налагодження Windows). fltmc> nul 2> & 1 працює в цьому плані краще.
kevinf

80

Рішення Андерса працювало на мене, але я не знав, як його перевернути, щоб отримати протилежне (коли ти не був адміністратором).

Ось моє рішення. У ньому є два випадки, якщо це IF та ELSE, а також деяке мистецтво, щоб люди могли його читати. :)

Мінімальна версія

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: 28.08.2012 Оновлено для підтримки Windows 8. @BenHooper вказав на це у своїй відповіді нижче. Будь ласка, підкажіть його відповідь.


1
ATне працює в Windows 8, але я знайшов краще рішення. Насправді я опублікував це як відповідь: stackoverflow.com/questions/4051883/… (або ви можете просто прокрутити вниз, що завгодно).
mythofechelon

1
Цікаво, чи два рядки, якщо% errorLevel% == / EQU на першому кодовому блоці є TYPO .. будь ласка, виправте.
Ujjwal Singh

@UjjwalSingh Це точно було. Дякую за ловлю. Я оновив його.
blak3r

Ви можете замінити "Rushyo розмістив це рішення тут" вашим коментарем про мене зараз, коли ви використовуєте моє рішення? :)
mythofechelon

Не працює для групи адміністраторів домену, доданої до групи адміністраторів на локальній машині та вхід у систему з користувачем адміністратора домену.
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тільки після успішного виконання.

Ось що говорить документація:

Fsutil брудний

Запитує чи встановлює брудний біт гучності. Коли брудний біт гучності встановлений, 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 Vista
  • Windows 7
  • Windows 8
  • Windows 8.1
    ---
  • Windows PE

1
+1 Відмінні рішення. Зокрема, рішення SFC представляється надійною перевіркою для всіх операційних систем. Якщо я зіткнуся з будь-якими проблемами, використовуючи будь-яку з них, я повідомлю про них тут.
Лектрод

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.
Лектрод

Чудова робота, @ and31415! Я ще особисто не перевіряв ваше fsutilрішення, але, як я бачу, воно виглядає набагато гнучкішим, ніж моє рішення. Хоча, не дуже елегантно, можливо. ;) Я радий бачити, що між нами ми отримуємо відмінне, легке та гнучкі рішення для виявлення адміністратора. :)
mythofechelon

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

Епічні ... Чи має у наборі рішення "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
Хоча цей код може відповісти на запитання, вам слід додати пояснення, чому це робиться.
ПлазмаHH

2
Так! Це працює правильно навіть тоді, коли користувач Power User (на відміну від "неттової сесії"). Однак немає потреби в кнопці / popd. Достатньо лише запуску openfilesта перевірки ERRORLEVEL.
EM0

2
Я використовую це рішення, і це працює добре. Проблема полягає в тому, що openfiles.exeвін не працює в WinPE, тому сценарій завжди поверне те, що користувач не адміністратор.
Wayfarer

Документацію для openfiles.exe можна знайти на technet.microsoft.com/de-de/library/bb490961.aspx . 1>і 2>&1пояснюються на microsoft.com/resources/documentation/windows/xp/all/proddocs/… . nulпосилається на нульовий пристрій
user1460043

13

Не тільки перевіряйте, але автоматично отримуєте права адміністратора,
також як автоматичний UAC для 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 або спеціальних стандартних сервісах вниз, і такі не є важливими випадками використання - для деяких адміністраторів, можливо, вони є.)


Це чудово! Зауважте одне - виклик його з Visual Basic працює так start- він відкриває сценарій у новому вікні. Якщо ви хочете побачити результати, додайте в pauseкінці свого сценарію. Крім того, важко визначити, коли ми «залишаємось» піднятими, і коли є повтор. Для цього можна використовувати аргумент командного рядка: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…
Tomasz

@Philm: Що робити, якщо UAC вимагає від користувача ввести свій пароль? Я припускаю, що цей код не надасть їм прав адміністратора автоматично, без того, щоб користувач спершу
ввів

@copyitright. Ні, звичайно ні. Але якщо пароль необхідний чи ні, тут не є різницею: те, що я мав на увазі під "автоматично", це, звичайно, що сценарій запускає Windows автоматично ASK для прав, а не більше. Без такої конструкції пакетний сценарій не вдався б, якщо його запустити подвійним клацанням або подібним. Щоб уникнути цього, користувачеві доведеться заздалегідь знати, що сценарій вимагає підвищених прав і повинен був запустити його так.
Філм

Тож мій сценарій просто дозволяє автору пакетних файлів змістити момент необхідного піднесення до точки під час виконання пакетного пакету, якого він або вона хоче. Або іншими словами: Щоб дозволити більш зручне виконання звичайним "подвійним клацанням". Оскільки я вважав такі пакетні файли, як правило, використовувані професіоналами або користувачами, які дуже добре знають основні технології 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, таких як чистий сеанс, який можна відключити за допомогою адміністративної / мережевої політики або команд, таких як 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 за допомогою дозволів за замовчуванням, ви отримаєте Access Denied та the ERRORLEVEL == 1, але якщо ви запустите як Admin, він надрукує "команду виконано успішно" та ERRORLEVEL == 0. Оскільки ключ вже існує, він не впливає на реєстр. Це, мабуть, найшвидший спосіб, і РЕГ існує там давно.

* Це недоступно на попередньому NT (Win 9X).

* Працює на XP та пізніших версіях


Робочий приклад

Сценарій, який очищає папку temp


1
Мені дуже подобається метод реєстру. Я насправді пам'ятаю про це, не потрібно шукати його кожного разу, коли я ним користуюся.
Зловмисник

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 і не потребує жодних ресурсів, таких як спеціальний каталог, файл або ключ реєстру.


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


+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раніше, ви отримаєте неправильну інформацію.


whoami /groupsне надає неправильну інформацію. Це просто runas /trustlevelставить вас у несподіване місце: працює без прав адміністратора, але з високим рівнем цілісності. Ви можете підтвердити це за допомогою Провідника процесів. (Це може бути помилка, runasале це не помилка whoami.)
Гаррі Джонстон,

Гаррі, я чую, що ти говориш, але чи можеш ти детальніше розглянути це? Я не розумію коментар стосовно того, runas /trustlevel коли ви локальний адміністратор, а UAC відключений, видача команди runas з адміністративного запиту переведе вас у контекст безпеки "базового користувача". Перебуваючи в цьому режимі, ви не можете виконувати операції адміністратора. Спробуйте "net session", або fsutil "або будь-яку іншу утиліту, яка потребує доступу адміністратора. Однак" whoami / groups "повідомляє вам, що ви підвищені. Коли ви цього не зробите. Факт, що викликає GetTokenInformation, повертає" TokenElevationTypeDefault ".
zumalifeguard

Я не впевнений, що я розумію, що ви маєте на увазі під "whoami / групи говорять вам, що ви підвищені"; це буквально не виводить рядок "ти піднесений", чи не так? Яку частину результатів Whoami / груп ви шукаєте?
Гаррі Джонстон

Гаррі, я бачу, мені було не ясно. По-перше, тому ми з вами на одній сторінці. Є декілька хитрощів, які люди використовують для визначення того, чи працює командний рядок у стані, який має доступ адміністратора. Поширеними методами є використання вбудованої команди, такої як fsutil, at, whoami та "net session". Використання "at" застаріле. Якщо ви шукаєте на цій сторінці, ви побачите приклади за допомогою fsutil, whoami та "net session". Дивіться тут для більшого кількості прикладів Whoami: stackoverflow.com/questions/7985755 / ...
zumalifeguard

Також використання фрази "біг піднятий" не зовсім коректно. Що я (та інші) мушу сказати "працює з правами адміністратора". Якщо UAC вимкнено, це просто працює під час входу в систему як локальний адміністратор, але явно не знижує рівень довіри, наприклад, з рунами. Коли UAC увімкнено, це означає, що користувач працює в піднятому підказці.
zumalifeguard

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

2
Проблема тут полягає в тому, що ви перевіряєте, чи має користувач права адміністратора. Але пакетний сценарій може працювати без прав адміністратора.
танацій

2
Плюс whoamiне підтримується в Windows XP.
mythofechelon

Також у whoami / groups є кращий випадок, коли ви отримуєте неправильну інформацію. Див stackoverflow.com/questions/4051883 / ...
zumalifeguard

2

Деякі сервери відключають послуги, необхідні для команди "net session". Це призводить до того, що адміністратор перевіряє завжди, коли у вас немає прав адміністратора.


2

Редагувати: copyitright вказав, що це ненадійно. Затвердження доступу для читання з UAC дозволить dir досягти успіху. У мене є трохи більше сценарію, щоб запропонувати іншу можливість, але це не лише для читання.

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 / exit зараз завжди 0, незважаючи на те, що сценарій використовується як стандартний користувач.
script'n'code

1

Примітка: Перевірка cacls для системи \ system32 \ config \ ЗАВЖДИ не вдасться у WOW64 (наприклад, від% systemroot% \ syswow64 \ cmd.exe / 32 біт Total Commander), тому сценарії, які працюють у 32-бітовій оболонці в 64-бітовій системі, назавжди циклічно ... Краще буде перевірка прав на каталог Prefetch:

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\Prefetch\"

Win XP для 7 перевірених, однак він не в програмі WinPE, як у Windows 7 install.wim немає ні таких dir, ні cacls.exe

Також у програмі winPE AND wow64 не вдається перевірити файл openfiles.exe:

OPENFILES > nul

У Windows 7 це буде помилка рівня "1" з інформацією про те, що "Цільова система повинна бути 32-бітовою операційною системою"

Обидві перевірки, ймовірно, також не зможуть у консолі відновлення.

Те, що працює в Windows XP - 8 32/64 біт, WOW64 та WinPE, це: тести створення dir (АКО адміністратор не килимів килимом, бомбардував каталог Windows з дозволами для всіх ...) та

net session

і

reg add HKLM /F

чеки.

Також ще одна примітка в деяких Windows XP (та й інших версіях, мабуть, теж, залежно від химерності адміністратора), залежно від записів реєстру, що безпосередньо викликають bat / cmd з .vbs-скрипту, не вдасться з інформацією про те, що файли bat / cmd ні з чим не пов'язані ...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

Виклик cmd.exe з параметром файлу bat / cmd з іншого боку працює ОК:

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/C %~s0", "", "runas", 1 >> "%temp%\getadmin.vbs"
cscript "%temp%\getadmin.vbs" //nologo

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.


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

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


0

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

Вихідні коди:

0 - Поточний користувач, який не є членом групи адміністраторів

1 - Поточний член користувача Адміністраторів і працює підвищеним

2 - Поточний член користувача Адміністраторів, але не працює підвищеним


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

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

0

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


Це здається неправильним, воно показує, чи має користувач права адміністратора, але це не пов’язано з питанням, чи працює поточний cmd.exe з правами адміністратора
jeb

ні, це показує, чи має поточний cmd.exe адміністративний доступ до бази даних користувачів чи ні, тому він працює навіть у тому випадку, коли "неттовий сеанс" відсутній. альтернативно, "net config> nul 2> & 1 && echo admin || echo not admin" виконує роботу. Обидві конструкції успішно протестовані на Windows xp під гостем, користувачем енергії та адміністративними обліковими записами з LanmanServer зупинено (errorlevel 2 для cmd.exe запускається під гостем та користувачем живлення, errorlevel 0 для cmd.exe під правами адміністратора). Чи буде це працювати у Vista та пізніше з вищезазначеними проблемами UAC - я не знаю, тож було б добре, якби хтось міг його перевірити.
єретик

2
Я протестував з двома cmd вікнами (win7x64), розпочався з і без прав адміністратора. В обох випадках це показаноadmin
jeb

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

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

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

-1

Ось мої 2 копійки варті:

Мені потрібна була партія для запуску в середовищі Домена під час входу в систему, в середовищі "робочої кімнати", бачачи, що користувачі дотримуються політики "блокування" та обмеженого перегляду (в основному поширюються через набори GPO).

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

наприклад: Пропоноване середовище профілю "користувач за замовчуванням" вимагає ярлика ".URL" (.lnk), розміщеного у "% ProgramData% \ Microsoft \ Windows \ Меню" Пуск "\ Програми * 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

Набори ПК домену повинні максимально керуватися наборами GPO. Цей сценарій може регулюватися робочою групою / автономними машинами.

Пам’ятайте, що підказка UAC з'явиться щонайменше один раз на ПК робочої групи BYOD (як тільки буде потрібно перше підняття на «Адміністратори»), але оскільки локальна політика безпеки буде змінена для використання адміністратором з цього моменту, спливаючі вікна зникнуть.

Доменний ПК повинен мати встановлену груповою політикою "ConsentPromptBehaviorAdmin" політику у вашій "вже" створеній політиці "Блокування вниз" - як це пояснено в розділі "СПИСОК".

Знову запустіть імпорт secedit.exe файлу '.inf' за замовчуванням, якщо ви застрягли в цілому дискусії "Для UAC або Не для UAC" :-).

btw: @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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.