Я пытаюсь написать командный файл для своих пользователей, чтобы они запускались со своих компьютеров Vista с UAC. Файл перезаписывает свой файл hosts, поэтому его необходимо запускать с разрешениями администратора. Мне нужно иметь возможность отправить им электронное письмо со ссылкой на файл .bat. Желаемое поведение состоит в том, что, когда они щелкают правой кнопкой мыши по файлу и говорят «Открыть», они получают одно из тех диалогов UAC, которое заставляет экран потемнеть и заставляет их ответить, хотят ли они дать приложению разрешение на запуск от имени администратора. Вместо этого они просто видят «Отказано в доступе» в окне командной строки.
Возможно ли это сделать по-другому?
Ответы:
Этот скрипт делает свое дело! Просто вставьте его в верхнюю часть вашего файла летучей мыши. Если вы хотите просмотреть вывод вашего скрипта, добавьте команду «пауза» внизу вашего пакетного файла.
ОБНОВЛЕНИЕ: Этот скрипт теперь немного отредактирован для поддержки аргументов командной строки и 64-битной ОС.
Спасибо Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
источник
Вот одна строка, которую я использовал:
Ноты:
источник
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
параметры будут на один уровень выше того, где они были'am_admin %*'
для передачи всего, не очень хорошо работает с кавычками и пробелами, хотя: / Вы можете использоватьshift
в пакетном режиме для удаления первого аргумента, таким образом исправляя все аргументы, кроме%0
.cd /D %~dp0
послеif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Вот мой код! Это выглядит большим, но это в основном строки комментариев (строки начинающиеся с :).
Особенности:
Проверка подключенной папки (предупреждает вас, если администратор не может получить доступ к подключенному диску)
Может использоваться как внешняя библиотека (проверьте мой пост в этой теме: https://stackoverflow.com/a/30417025/4932683 )
Просто прикрепите это к концу вашего пакетного файла или сохраните как библиотеку (см. Выше)
Пример того, как его использовать
источник
&fc;: 2>nul
Вset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
садились в ErrorLevel 1. Я извлекал , что немного , и она работала идеально. Я использую Windows 10 Home.fc;:
как он идет: Eof сразу после? Я не уверен, почему это немного вызвало проблему, так как она должна быть выполнена.echo/%TEMP%| findstr /C:"(" >nul
проверяет, есть ли(
в%temp%
переменной окружения yout char , и должна запускать деталь только после&&
положительного if. Странно, почему ваш(
тест возвращается положительным, хотя.Другой подход заключается в
а потом
источник
Решение Бена Грипки вызывает бесконечные петли. Его партия работает так (псевдокод):
Как видите, это вызывает бесконечный цикл, если VBS не может запросить права администратора.
Однако может возникнуть бесконечный цикл, хотя права администратора были успешно запрошены.
Проверка в командном файле Бена Грипки просто подвержена ошибкам. Я поиграл с пакетом и заметил, что права администратора доступны, хотя проверка не удалась. Интересно, что проверка работала, как и ожидалось, если я запустил пакетный файл из проводника Windows, но это не так, когда я запустил его из моей IDE.
Поэтому я предлагаю использовать два отдельных пакетных файла. Первый генерирует VBS, который вызывает второй пакетный файл:
Второй, названный my_commands.bat и расположенный в том же каталоге, что и первый, содержит ваши действительные команды:
Это не вызывает бесконечных циклов, а также удаляет подверженную ошибкам проверку привилегий администратора.
источник
Еще одно решение PowerShell ...
Речь идет не о запуске пакетного скрипта от имени администратора, а скорее о том, как поднять другую программу из пакетного ...
У меня есть пакетный файл "обертка" для exe. У них такое же «имя корневого файла», но альтернативные расширения. Я могу запустить exe-файл от имени администратора и установить рабочий каталог в каталог, содержащий скрипт, с помощью следующего однострочного вызова powershell:
Больше информации
Есть целый ряд дополнительных
Start-Process
опций, которые вы можете применить! Проверить: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Обратите внимание, что я использую
@
префикс. Это эквивалентно@echo off
одной строке. Я использую%~n0
здесь, чтобы получить «корневое имя» пакетного сценария, затем объединяю его,.exe
чтобы указать ему вспомогательный двоичный файл. Использование%~dp0
обеспечивает полный путь к каталогу, в котором находится пакет. И, конечно же , параметр обеспечивает повышение .-Verb RunAs
источник
Я знаю, что это не решение для OP, но так как я уверен, что здесь есть много других вариантов использования, я решил поделиться.
У меня были проблемы со всеми примерами кода в этих ответах, но потом я нашел: http://www.robotronic.de/runasspcEn.html
Он не только позволяет вам работать от имени администратора, он проверяет файл, чтобы убедиться, что он не был подделан, и надежно сохраняет необходимую информацию. Я признаю, что это не самый очевидный инструмент, чтобы понять, как использовать, но для тех из нас, кто пишет код, он должен быть достаточно простым.
источник
@echo off
иtitle
может предшествовать этому коду:Многие другие ответы излишни, если вам не нужно беспокоиться о следующем:
cd %~dp0
изменится на каталог, содержащий пакетный файл)источник
Выше работает на моей Windows 10 версии 1903
источник
Так как у меня возникают проблемы с этим сценарием, который выдает новую командную строку с повторным запуском в бесконечном цикле (с использованием Win 7 Pro), я предлагаю вам попробовать другой подход: как я могу автоматически поднять свой пакетный файл, чтобы он запрашивал у Права администратора UAC, если требуется?
Будьте осторожны, вы должны добавить это в конце скрипта, как указано в правке, чтобы вернуться в каталог скриптов после повышения привилегий: cd / d% ~ dp0
источник
Основываясь на сообщениях Toster-CX и других интересных постах на этой странице, я получил представление о том, как настроить и решить мою проблему. У меня была похожая проблема, когда я хотел, чтобы утилита очистки диска запускалась каждую неделю дважды в понедельник и четверг в обеденное время (скажем, в 14:00). Однако это требовало повышенных прав.
Совместное использование командного файла, который может помочь другим новичкам, как я -
Большое спасибо за этот форум и Rems POST здесь [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ] [1]
Его сообщение помогло настроить необязательный аргумент при планировании задачи.
источник
Из этого поста также есть запрос FSUTIL, который также связан с ss64.com и имеет следующий код:
Пока FSUTIL существует, это надежная альтернатива.
источник
Вы не можете запрашивать права администратора у пакетного файла, но вы можете написать сценарий хоста сценариев Windows в% temp% и запустить его (и который в свою очередь выполняет ваш пакет как администратор). Вы хотите вызвать метод ShellExecute в командной консоли. Объект приложения с "runas" в качестве глагола
источник
Используйте
mshta
для запроса прав администратора:Или, используя powershell:
источник
используйте команду runas. Но я не думаю, что вы можете легко отправить файл .bat по электронной почте.
источник
runas
не может быть использована, чтобы спровоцировать повышение.