Как проверить, имеет ли текущий пакетный скрипт права администратора?
Я знаю, как заставить его вызывать себя с помощью runas, но не знаю, как проверить права администратора. Единственные решения, которые я видел, - это грубые хакерские задания или использование внешних программ. Ну, на самом деле мне все равно, если это хакерская работа, если она работает на Windows XP и новее.
windows
batch-file
cmd
admin
flacs
источник
источник
Ответы:
вопросы
Решение blak3r / Rushyo прекрасно работает для всего, кроме Windows 8. Запуск
AT
в Windows 8 приводит к:(см. скриншот № 1) и вернется
%errorLevel%
1
.Исследовательская работа
Итак, я пошел искать другие команды, которые требуют повышенных разрешений. У rationallyparanoid.com был список из нескольких, поэтому я запускал каждую команду на двух противоположных крайностях текущих операционных систем Windows (XP и 8) в надежде найти команду, которой будет запрещен доступ в обеих ОС при запуске со стандартными разрешениями.
В конце концов, я нашел один -
NET SESSION
. Истинное , чистое, универсальное решение , которое не включает в себя:FOR
цикловAT
(несовместимо с Windows 8) илиWHOAMI
(несовместимо с Windows XP).Каждый из них имеет свои собственные проблемы безопасности, удобства использования и переносимости.
тестирование
Я независимо подтвердил, что это работает на:
(см. скриншот № 2)
Реализация / Использование
Итак, чтобы использовать это решение, просто сделайте что-то вроде этого:
Доступно здесь, если вы ленивы: https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat
объяснение
NET SESSION
это стандартная команда, используемая для «управления подключениями к компьютеру. Используется без параметров, [она] отображает информацию обо всех сеансах с локальным компьютером».Итак, вот основной процесс моей реализации:
@echo off
goto check_Permissions
:check_Permissions
блоку кодаnet session >nul 2>&1
STDOUT
) наnul
STDERR
) в то же место назначения, что и числовой дескриптор 1if %errorLevel% == 0
%errorLevel%
) равно,0
это означает, что ошибок не было и, следовательно, предыдущая команда была успешно выполненаelse
%errorLevel%
) не равно,0
это означает, что произошли ошибки и, следовательно, предыдущая команда была выполнена неудачноСкриншоты
Windows 8
AT
%errorLevel%
:NET SESSION
в Windows XP x86 - Windows 8 x64 :Спасибо, @Tilka, за изменение принятого ответа на мой. :)
источник
net session
успешно работать (ERRORLEVEL = 0), но на самом деле он не имеет прав администратора. Использованиеopenfiles
(см. Ответ Лукреция ниже) не имеет этой проблемы.Решение Андерса сработало для меня, но я не был уверен, как инвертировать его, чтобы получить противоположное (когда вы не были администратором).
Вот мое решение. У него есть два случая IF и ELSE, а также несколько примеров ascii, чтобы люди действительно читали его. :)
Минимальная версия
Rushyo разместил это решение здесь: Как определить, работает ли CMD от имени администратора или имеет повышенные привилегии?
Версия, которая добавляет сообщения об ошибках, паузы и выходы
Работает на WinXP -> Win8 (включая 32/64 битные версии).
РЕДАКТИРОВАТЬ: 28.08.2012 Обновлено для поддержки Windows 8. @BenHooper указал на это в своем ответе ниже. Пожалуйста, подтвердите его ответ.
источник
AT
не работает на Windows 8, но я нашел лучшее решение. На самом деле я разместил это как ответ здесь: stackoverflow.com/questions/4051883/… (или вы можете просто прокрутить вниз, что угодно).Больше вопросов
Как указывает @Lectrode, если вы попытаетесь выполнить
net session
команду, когда служба сервера остановлена, вы получите следующее сообщение об ошибке:В этом случае
%errorLevel%
переменная будет установлена в2
.Примечание. Служба сервера не запускается в безопасном режиме (с сетевым подключением или без него).
Ищете альтернативу
Что-то, что:
Поэтому я загрузил виртуальную виртуальную машину Windows XP и начал просматривать список приложений в
C:\Windows\System32
папке, пытаясь найти некоторые идеи. После проб и ошибок, это грязный (каламбур) подход, который я придумал:fsutil dirty
Команда требует прав администратора для запуска, и не сможет иначе.%systemdrive%
является переменной среды , которая возвращает букву диска , на котором установлена операционная система. Выход перенаправляется наnul
, поэтому игнорируется.%errorlevel%
Переменная будет установлен0
только после успешного выполнения.Вот что говорится в документации:
Дальнейшие исследования
Хотя вышеприведенное решение работает с Windows XP и далее, стоит добавить, что Windows 2000 и Windows PE (предустановленная среда) не поставляются с
fsutil.exe
, поэтому мы должны прибегнуть к другому.Во время моих предыдущих тестов я заметил, что выполнение
sfc
команды без каких-либо параметров приведет либо к:То есть: без параметров, без партии . Идея состоит в том, что мы можем проанализировать вывод и проверить, не получили ли мы что-либо, кроме ошибки:
Вывод ошибки сначала перенаправляется на стандартный вывод, который затем передается в
find
команду. На данный момент мы должны искать только параметр , который поддерживается во всех версии Windows , начиная с Windows 2000/SCANNOW
. Поиск нечувствителен к регистру, а вывод отбрасывается путем перенаправления его наnul
.Вот выдержка из документации:
Образец использования
Вот несколько примеров вставки и запуска:
Windows XP и выше
Windows 2000 / Windows PE
Относится к
---
источник
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.fsutil
решение, но, насколько я вижу, оно кажется гораздо более гибким, чем мое решение. Хотя, возможно, не так элегантно. ;) Я рад видеть, что между нами мы получаем отличное, простое и гибкое решение для обнаружения администраторов. :)fsutil dirty query >nul
повышенными правами, это возвращает текст справки и% errorlevel% = 0fsutil dirty query >nul
, однакоfsutil dirty query %systemdrive% >nul
все еще работаетеще два способа - быстрый и обратно совместимый.
fltmc
Команда доступна в любой системе Windows начиная с XP, поэтому она должна быть довольно переносимой.Еще один очень быстрое решение проверено на
XP
,8.1
,7
- есть одна конкретная переменная ,=::
которая представлена только в случае , если сеанс консоли не имеет администратора privileges.As это не так легко создать переменную , которая содержит=
в его имя это сравнительно надежный способ проверки для администратора разрешение (он не вызывает внешние исполняемые файлы, поэтому он работает хорошо)Если вы хотите использовать это непосредственно через командную строку, но не из командного файла, вы можете использовать:
источник
=::
переменной - это скорее ошибка - она представляет собой несуществующий диск, поэтому, вероятно, это было исправлено в win10.=::
что определено для CMD без прав администратора в Windows 10 1709. В любом случае это ненадежный способ, вы можете легко заставить его быть определенным даже на сеансах CMD администратора:subst :: c:\ & for %a in (::) do %a & set,
источник
альтернативное решение:
источник
openfiles
и проверить ERRORLEVEL.openfiles.exe
в WinPE не работает, поэтому сценарий всегда возвращает, что пользователь не является администратором.1>
и2>&1
объяснены на microsoft.com/resources/documentation/windows/xp/all/proddocs/… .nul
относится к нулевому устройствуНе только проверка, но и ПОЛУЧЕНИЕ прав администратора автоматически, также
называемое Automatic UAC для Win 7/8 / 8.1 и далее. Следующее является действительно классным с еще одной функцией: Этот пакетный фрагмент не только проверяет права администратора, но и получает их автоматически! (и тестирует раньше, если живет на ОС с поддержкой UAC.)
С этим трюком вам больше не нужно кликать правой кнопкой мыши на вашем командном файле "с правами администратора". Если вы забыли, чтобы запустить его с повышенными правами, UAC появится автоматически! Более того, сначала он тестируется, если ОС требует / предоставляет UAC, поэтому он ведет себя корректно, например, для Win 2000 / XP до тех пор, пока не протестируется Win 8.1.
Фрагмент объединяет несколько хороших шаблонов пакетов, особенно (1) тест администратора в этой теме, выполненный Беном Хупером, и (2) активация UAC, прочитанная на BatchGotAdmin и процитированная на сайте пакетной обработки robvanderwoude (уважение). (3) Для идентификации ОС по «VER | FINDSTR pattern» я просто не нахожу ссылку.)
(Что касается некоторых очень незначительных ограничений, когда «NET SESSION» не работает, как упомянуто в другом ответе, не стесняйтесь вставлять другую из этих команд. Для меня работа в безопасном режиме Windows или специальные стандартные службы не работают, и это не является важным вариантом использования) - для некоторых администраторов, возможно, они есть.)
источник
start
- он открывает скрипт в новом окне. Если вы хотите увидеть результаты - добавьтеpause
в конце вашего скрипта. Кроме того, трудно определить, когда мы «остаемся» поднятыми, и когда происходит повторный запуск. Для этого вы можете использовать аргумент командной строки: github.com/tgandor/meats/blob/master/lang_lawyer/cmd/…У меня есть два способа проверки привилегированного доступа, оба довольно надежны и очень переносимы практически во всех версиях Windows.
1. Метод
* Работает на XP и позже
2. Метод
* Работает на XP и позже
Рабочий пример
Скрипт, который очищает временную папку
Показать фрагмент кода
источник
В пакетном скрипте Elevate.cmd (см. Эту ссылку ), который я написал для получения прав администратора , я сделал это следующим образом:
Это проверено для Windows 7, 8, 8.1, 10 и даже Windows XP и не требует каких-либо ресурсов, таких как специальный каталог, файл или раздел реестра.
источник
Я обнаружил, что самый простой способ проверки прав администратора с использованием сценария CMD выглядит примерно так:
Этот метод использует только встроенные CMD.exe, поэтому он должен быть очень быстрым. Он также проверяет действительные возможности процесса, а не проверяет SID или членство в группах, поэтому проверяется действующее разрешение. И это работает еще в Windows 2003 и XP. Обычные пользовательские процессы или процессы без прав доступа терпят неудачу при проверке каталога, где успешно выполняются процессы с правами администратора или с повышенными правами.
источник
Следующее пытается создать файл в каталоге Windows. Если это удастся, это удалит это.
Обратите внимание, что 06CF2EB6-94E6-4a60-91D8-AB945AE8CF38 - это GUID, который был сгенерирован сегодня, и предполагается, что он вряд ли конфликтует с существующим именем файла.
источник
was generated today and it is assumed to be improbable to conflict with an existing filename.
кроме тех случаев, когда два человека используют этот кодWhoami / группы не работает ни в одном случае. Если у вас полностью отключено UAC (не только отключено уведомление), и вы запустились из командной строки администратора, введите:
вы будете работать без повышенных прав, но с выдачей:
скажу, что ты возвышен Это не правильно. Вот почему это неправильно:
При работе в этом состоянии, если 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
дважды, потому что если кто-то сделалat
предварительную раздачу, вы получите неверную информацию.источник
whoami /groups
не предоставляет неверную информацию. Просто этоrunas /trustlevel
ставит вас в неожиданное положение: работа без прав администратора, но с высоким уровнем целостности. Вы можете подтвердить это с помощью Process Explorer. (Это может быть ошибка в,runas
но не ошибкаwhoami
.)runas /trustlevel
когда вы являетесь локальным администратором, а UAC отключен, ввод этой команды runas из командной строки администратора переведет вас в контекст безопасности «базового пользователя». В этом режиме вы не можете выполнять операции администратора. Попробуйте "net session", или fsutil ", или любую другую утилиту, для которой требуется доступ администратора. Однако" whoami / groups "говорит вам, что у вас повышен уровень. Если это не так. Тот факт, что вызов GetTokenInformation возвращает" TokenElevationTypeDefault ", указывает на это.источник
whoami
не поддерживается в Windows XP.Некоторые серверы отключают службы, необходимые для команды «net session». В результате проверки администратора всегда говорят, что у вас нет прав администратора, если у вас есть.
источник
Редактировать: авторское право указало, что это ненадежно. Утверждение доступа для чтения с UAC позволит директору преуспеть. У меня есть немного больше сценария, чтобы предложить другую возможность, но он не только для чтения.
Старый ответ ниже
Предупреждение: ненадежный
Основываясь на ряде других хороших ответов здесь и на вопросах, поднятых and31415, я обнаружил, что я поклонник следующего:
Мало зависимости и быстро.
источник
Примечание. Проверка с помощью cacls для \ system32 \ config \ system ВСЕГДА завершится неудачей в WOW64 (например, из% systemroot% \ syswow64 \ cmd.exe / 32-битного Total Commander), поэтому сценарии, которые выполняются в 32-битной оболочке в 64-битной системе, будут зацикливаться вечно ... Лучше бы проверить права на каталог Prefetch:
Win XP до 7 протестирована, однако в WinPE она не работает, как в Windows 7 install.wim нет ни dir, ни cacls.exe
Также в winPE AND wow64 не удается проверить с помощью openfiles.exe:
В Windows 7 он будет иметь уровень ошибки «1» с информацией о том, что «Целевая система должна быть 32-битной операционной системой»
Обе проверки, вероятно, также не пройдут в консоли восстановления.
То , что работает в Windows XP - 8 32/64 бит, в WOW64 и WinPE являются: реж тесты создания (IF админ не ковер бомбил каталог ОС Windows с правами для всех ...) и
и
чеки.
Кроме того, еще одно замечание в некоторых Windows XP (и, возможно, в других версиях, в зависимости от действий администратора), в зависимости от того, какие записи реестра напрямую вызывают bat / cmd из скрипта .vbs, будет означать, что файлы bat / cmd не связаны ни с чем ...
С другой стороны, вызов cmd.exe с параметром файла bat / cmd работает нормально:
источник
Буквально десятки ответов на этот и связанные вопросы и в других местах в SE, каждый из которых так или иначе несовершенен, ясно показали, что Windows не предоставляет надежную встроенную консольную утилиту. Итак, пришло время выкатить свои собственные.
Следующий код C, основанный на Определении, если программа работает с полными правами администратора , работает в Win2k + 1 , где угодно и во всех случаях (UAC, домены, переходные группы ...) - потому что он делает то же самое, что и сама система, когда она проверяет разрешения. Он сигнализирует о результате как сообщением (которое может быть отключено с помощью переключателя), так и кодом выхода.
Необходимо только , чтобы быть собран один раз, то вы можете просто скопировать
.exe
везде - это зависит только отkernel32.dll
иadvapi32.dll
(я загрузил копию ).chkadmin.c
:1 MSDN утверждает, что API являются XP +, но это неверно.
CheckTokenMembership
это 2k +, а другой еще старше . Последняя ссылка также содержит гораздо более сложный способ, который будет работать даже в NT.источник
PowerShell кто-нибудь?
источник
Вот еще один, чтобы добавить в список ;-)
(попытка создания файла в системном расположении)
MODE CON
Инициализирует экран и surpresses любой текст / ошибки , когда не имея разрешения на запись в месте системы.источник
Альтернатива: используйте внешнюю утилиту, разработанную для этой цели, например IsAdmin.exe (неограниченное бесплатное программное обеспечение).
Коды выхода:
0 - текущий пользователь не является членом группы администраторов
1 - текущий пользователь с правами администратора и работающий с повышенными правами
2 - текущий пользователь-администратор, но не работает с повышенными правами
источник
источник
Я объясню код построчно:
Пользователи будут раздражены более чем 1 строк без этого.
Точка, где начинается программа.
Установите имя файла каталога, который будет создан.
Создает каталог
<DL>:\Windows
(замените <DL> буквой диска).Если переменная окружения ERRORLEVEL равна нулю, то выводится сообщение об успехе.
Идите до конца (не продолжайте дальше).
Если ERRORLEVEL равен единице, выведите сообщение об ошибке и перейдите к концу.
Если имя файла уже существует, заново создайте папку (в противном случае
goto end
команда не позволит запустить ее).Укажите конечную точку
Удалить созданный каталог.
Пауза, чтобы пользователь мог видеть сообщение.
Примечание :
>nul
и2>nul
фильтруют выходные данные этих команд.источник
net user %username% >nul 2>&1 && echo admin || echo not admin
источник
admin
Я думаю, что самый простой способ - попытаться изменить системную дату (для этого требуются права администратора):
Если
%date%
переменная может включать день недели, просто получите дату из последней частиDATE
команды:источник
:(
Я нашел пользователя, который может использовать,
net session
даже если он не является администратором. Я не изучал почему. Мой обходной путь - проверить, может ли пользователь создать папку в папке Windows.Вот мой код:
источник
Коллекция из четырех, казалось бы, наиболее совместимых методов с этой страницы. Первый действительно гениален. Проверено с XP. Заблуждение, однако, что нет стандартной команды для проверки прав администратора. Я полагаю, что сейчас они просто сосредоточены на PowerShell, который действительно бесполезен для большей части моей собственной работы.
Я вызвал пакет 'exit-if-not-admin.cmd', который можно вызывать из других пакетов, чтобы убедиться, что они не продолжат выполнение, если не предоставлены необходимые права администратора.
источник
Вот мои 2 копейки стоит:
Мне нужен был пакет для запуска в среде домена во время процесса входа пользователя, в среде «рабочей комнаты», чтобы пользователи придерживались политики «блокировки» и ограниченного просмотра (в основном, распространяемого через наборы объектов групповой политики).
Набор объектов групповой политики домена применяется до того, как сценарий входа пользователя, связанный с AD, создает сценарий входа объекта групповой политики, который был слишком зрелым, поскольку «новый» профиль пользователя не был создан / загружен / или не был готов вовремя применить «удалить и / или Закрепить панель задач и пункты меню Пуск vbscript + добавить несколько локальных файлов.
Например: для предлагаемой среды профиля «user-default» требуется ярлык «.URL» (.lnk), помещенный в «% ProgramData% \ Microsoft \ Windows \ Start Menu \ Programs * MyNewOWA.url *» и «C: Местоположения \ Users \ Public \ Desktop \ * MyNewOWA.url * ", среди прочих
Пользователи имеют несколько компьютеров в домене, где только эти установленные ПК «рабочей комнаты» требуют этих политик.
Эти папки требуют прав «Администратор» для изменения, и хотя «Пользователь домена» является частью локальной группы «Администратор» - UAC был следующей проблемой.
Найдены различные приспособления и объединены здесь. У меня есть пользователи с устройствами BYOD, которым требуются другие файлы с проблемами с разрешением. Не тестировал на XP (слишком старая ОС), но код присутствует, хотел бы получить обратную связь.
Доменные ПК должны в максимально возможной степени регулироваться наборами объектов групповой политики. Рабочая группа / автономные машины могут управляться этим сценарием.
Помните, что приглашение UAC будет всплывать как минимум один раз на ПК рабочей группы BYOD (как только потребуется первое повышение до «Административные привилегии»), но, поскольку с этого момента локальная политика безопасности изменяется для использования администратором, всплывающие окна исчезнут.
На доменном ПК должна быть политика GPO «ConsentPromptBehaviorAdmin», установленная в вашей «уже» созданной политике «блокировки» - как объяснено в разделе «Ссылки» сценария.
Опять же, запустите secedit.exe импорт файла по умолчанию «.inf», если вы застряли во всей дискуссии «В UAC или не в UAC» :-).
кстати: @boileau Проверьте свою неудачу на:
Запустив "% SYSTEMROOT% \ system32 \ cacls.exe" или "% SYSTEMROOT% \ system32 \ config \ system" или оба из командной строки - с повышенными правами или нет, проверьте результат по всем направлениям.
источник
Еще один способ сделать это.
источник