Статья Как запустить программу с повышенными привилегиями

Тема в разделе "FAQ по Пакетным файлам CMD/BAT", создана пользователем Dragokas, 30 сен 2013.

Статус темы:
Закрыта.
  1. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Шаблон для ответа на форуме (для всех версий операционных систем):
    Нажмите комбинацию клавиш Ctrl + Esc (удерживая кнопку Ctrl, нажмите Esc)
    Введите английскими cmd и нажмите комбинацию Ctrl + Shift + ENTER (удерживая одновременно Ctrl и Shift, нажмите Enter)

    1. Запуск программы с повышенными привилегиями

    Нажимаем правой клавишей мыши по файлу программы,
    выбираем пункт "Запуск от имени Администратора".

    Adm_Click.png

    2. Запуск командной строки CMD с повышенными привилегиями

    Способ 1.

    Нажимаем ПУСК (клавишу Win или комбинацию клавиш Ctrl + Shift + Esc)
    Переключаемся на англ. раскладку, и вводим cmd
    В найденных приложениях нажимаем правой клавишей мыши по cmd.exe и выбираем "Запуск от имени Администратора"

    CMD_open_with_Admin.png

    Способ 2 - быстрый запуск:

    Только с помощью клавиатуры:

    Win, вводим CMD, далее комбинация Ctrl + Shift + Enter

    Start_Cmd.jpg

    Способ 3 - когда доступен только "Диспетчер задач":

    Войти в диспетчер задач (Ctrl + Shift + Esc или Ctrl + Alt + Delete, затем пункт "Диспетчер задач")
    Вкладка "Процессы", кнопка "Отображать процессы всех пользователей".
    Меню "Файл", Ctrl + Клик ЛКМ (левая кнопка мыши) по пункту "Новая задача (Выполнить ...)".

    taskmgr02.jpg taskmgr04.jpg

    Ссылки по теме:
    В. Стеркин Как открыть командную строку от имени администратора в нужной папке
    В. Стеркин Как открывать файлы из контекстного меню с полными правами
     
    Последнее редактирование: 6 янв 2014
    Mistik, akok, Phoenix и 3 другим нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Как работает контроль учетных записей пользователей

    В системах Windows Vista, 7, 8 появилась новая защита - контроль учетных записей (User Account Control - UAC),
    которая действует даже на пользователя группы "администраторы", чаще всего используемого по-умолчанию.

    Ее основа - это блокировка от:

    • изменения важных системных настроек;
    • внесения записей в ульи реестра HKCR, HKLM;
    • записи файлов в корень системного диска, а также в каталоги Program Files, Windows и некоторые другие.

    А если мы попытаемся выполнить запрещенное действие без повышения привилегий - что произойдет?

    Если это:
    - сторонняя программа
    она получит отказ (Код 5 - "В доступе отказано").
    Далее ее работа зависит от программиста.

    - работа пользователя со служебными программами (проводник, редактор реестра, diskpart...), либо нажатие на кнопку с эмблемой "щита"
    1) запускается утилита consent.exe,
    2) создается новый рабочий стол (что в корне предотвращает возможность управления извне)
    3) отображается диалоговое окно:

    UAC_Alert_Window.jpg

    Подтвердить действие можно с клавиатуры или мышью.

    UAC настраивается индивидуально для каждого пользователя.
    И может быть полностью отключен, что крайне не рекомендуется делать.
    Любопытно: 5 из 10 первых ответов Google на вопрос "Контроль учетных записей" - это "Как его отключить?"
    А я вот наоборот ставлю более высокий уровень.


    В случае отключения UAC снимаются все описанные выше ограничения и любая программа, запущенная в контексте пользователя
    будет иметь полные права для работы с системными папками, заменой владельца и изменения прав доступа к файлам.
    Как результат - преждевременный выход из строя ОС, пусть даже это будет установка безобидного ПО, несовместимого с текущей версией системы.

    UAC_Settings.jpg

    Ссылки по теме:
    MSDN Что такое контроль учетных записей пользователей?
    MSDN Параметры контроля учетных записей
    Wikipedia Контроль учётных записей пользователей
    В. Стеркин Так ли страшен контроль учетных записей?
     
    3 пользователям это понравилось.
  3. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Элевация прав запуска BAT-файла (отображается диалог контроля учетных записей UAC)

    А теперь практика.
    Попытаемся встроить в свой скрипт повышение привилегий путем вызова диалога контроля учетных записей (UAC).

    Метод основан на возможности скриптов VBScript, JScript благодаря объекту WSH "WScript.Shell" работать с API-функцией ShellExecute и вызывать недокументированный глагол "runas", запрашивающий диалог элевации прав для запуска приложения, заданного первым аргументом функции.

    Также эта функция позволяет задавать вид используемого окна (скрытое, развернутое на весь экран, свернутое в панель задач, неактивное...).

    Код (DOS):
    @echo off
    if "%1"=="" (
      Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"Admin","","runas",1 >"%~dp0Elevating.vbs"
      cscript.exe //nologo "%~dp0Elevating.vbs" "%~dpnx0"& Goto :eof
    )
    >nul del "%~dp0Elevating.vbs"
    chdir /d "%~dp0"

    ::

    :: <--- Здесь код Вашей основной программы
    ::

    :: Проверка

    ::Пытаемся записать пустой файл в корень системного раздела
    cd.>c:\test.log
    if exist c:\test.log Echo OK - привилегии получены.

    pause
    Приведенный пример распаковывает временный VBS-скрипт, через который методом ShellExecute, глаголом runas запускает повторно тот же BAT-файл, но уже с повышенными привилегиями.

    Код (DOS):
    @echo off

    :: Проверяем пустой ли первый аргумент

    :: Это нужно, чтобы не запустить процесс элевации дважды.
    :: Аргумент становится = "Admin", когда запускается команда [URL="http://ss64.com/vb/shellexecute.html"]ShellExecute[/URL]
    Имя скрипта, Аргумент, Рабочий каталог,Глагол,Режим отображения окна

    if "%1"=="" (

    :: Сохраняем скрипт в файл Elevating.vbs, который находится в папке %~dp0, т.е. рядом с батником

    ::Параметры такие:
    ::Имя скрипта - передано аргументом из cscript.exe (см.строку кода ниже)
    ::Аргументы: Admin - аргумент для бат-файла, чтобы не запустить элевацию дважды
    ::Рабочий каталог: "" - по умолчанию, текущий.
    ::Глагол (verb): runas - запуск от имени Администратора.
    ::Режим отображения окна: 1 - Normal (обычные режим. Окно отображается).
      Echo CreateObject^("Shell.Application"^).ShellExecute WScript.Arguments^(0^),"Admin","","runas",1 >"%~dp0Elevating.vbs"

    :: Запускаем сервер сценариев без отображение сведений о нем (//nologo), запускаем Elevating.vbs с аргументом = имени бат-файла с путем

      cscript.exe //nologo "%~dp0Elevating.vbs" "%~dpnx0"& Goto :eof
    )

    :: Удаляем Elevating.vbs

    >nul del "%~dp0Elevating.vbs"

    :: Переходим в каталог с бат-файлом

    :: При выполнении повышения прав рабочий каталог бат-файла автоматически сменяется на %windir%\system32
    chdir /d "%~dp0"

    ::Пытаемся записать пустой файл в корень системного раздела

    cd.>c:\test.log

    ::Если записанный файл существует - пишем ОК, то есть повышение прав удалось успешно.

    if exist c:\test.log Echo OK.
    pause
    Код очень похож:

    Код (DOS):
    @set @x=0; /*
    @echo off
    if "%1"=="" cscript.exe //nologo //e:jscript "%~f0"& Exit
    chdir /d "%~dp0"

    ::

    :: <--- Здесь код Вашей основной программы
    ::

    :: Проверка

    ::Пытаемся записать пустой файл в корень системного раздела
    cd.>c:\test.log
    if exist c:\test.log Echo OK - привилегии получены.

    pause
    exit /B

    :: Эту строку не трогать. Ниже этой строки ничего дописывать НЕЛЬЗЯ !!!

    */new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
    Код (DOS):

    :: Но если все-таки хочется что-то дописать в конец файла

    :: Последние строки можно изменить так:
    :: (снова открываем многострочный комментарий)

    */new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);/*

    ::

    :: <- Здесь любой код
    ::

    :: А здесь ОБЯЗАТЕЛЬНО закрываем многострочный комментарий

    */
     
    Комментарии:
    Здесь CMD-файл одновременно является JScript-файлом,
    т.к. не противоречит его синтаксису.

    В основе трюка лежит использование многострочного комментария /* ... */,
    так что дополнительной распаковки скрипта не требуется.

    Посмотреть вложение Admin_Rights_Example.zip
     
    Phoenix, orderman и Kиpилл нравится это.
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Полезный скрипт:

    Запускает новое окно консоли с повышенными правами и переходит в папку, где сам находится
    Теперь можете вводить в консоль свои команды, уже находясь в нужной папке.

    Код (DOS):
    @set @x=0; new ActiveXObject('Shell.Application').ShellExecute ('cmd.exe','/K ' + '"' + WScript.ScriptFullName + '"' + ' Admin','','runas',1);/*
    @echo off
    if "%1" neq "Admin" (
      cscript.exe //nologo //e:jscript "%~f0"
    ) else (
      cd /d "%~dp0"
    )
    exit /B

    */
     

    Вложения:

    Последнее редактирование: 18 окт 2013
    vavun, orderman и Kиpилл нравится это.
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Запуск VBScript с повышенными привилегиями программно (сам себя)

    Алгоритм работы демо:
    - через WMI получает версию ОС и сборки. Если первая цифра 6 (а это Vista, 7, 8), то:
    - проверяет права доступа к ветке реестра HKLM\System\CurrentControlSet\Control\Session Manager
    чем обеспечивает определение под какими правами сейчас запущен скрипт;
    - если получена ошибка, перезапускает себя с затребованием привилегий через диалоговое окно UAC.
    - далее практичный пример: узнаем текущую температуру ЦП, которую с правами пользователя не получишь.

    Код (vb.net):
    Const DQ = """", HKCU = &H80000001, HKLM = &H80000002, KQV = &H1, KSV = &H2

    Set colOS = GetObject("winmgmts:\root\cimv2").ExecQuery("Select * from Win32_OperatingSystem")

    For Each oOS In colOS
        strOSLong = oOS.Version
    Next

    If Left(strOSLong, 1) = "6" Then
        If Not isAdminRights Then
            Set oShellApp = CreateObject("Shell.Application")
            oShellApp.ShellExecute WScript.FullName, DQ & WScript.ScriptFullName & DQ, "", "runas", 1
        End If
    End If

    Set objWMIService = GetObject("winmgmts:\\.\root\WMI")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature", "WQL", _
                                              wbemFlagReturnImmediately + wbemFlagForwardOnly)
    on error resume next
    for each objItem in colItems
        WScript.Echo "Температура процессора (в цельсиях): " & (objItem.CurrentTemperature - 2732) / 10
    next
    WScript.Quit

    Function isAdminRights()
        Set oReg = GetObject("winmgmts:root\default:StdRegProv")
        strKey = "System\CurrentControlSet\Control\Session Manager"
        intErrNum = oReg.CheckAccess(HKLM, strKey, KQV + KSV, flagAccess)
        isAdminRights = flagAccess
    End Function
    Спасибо glax24 за ссылку на крутой скрипт :)
     
    Последнее редактирование: 18 окт 2013
    Phoenix, glax24 и Kиpилл нравится это.
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.307
    Как определить визуально, запущена ли командная строка с повышенными привилегиями:

    ADMIN_CMD.png

    Заголовок окна должен начинаться со слов:
    для RU-систем: "Администратор: "
    для EN-систем: "Administrator: "
     
    fseto, Phoenix и Kиpилл нравится это.
Статус темы:
Закрыта.

Поделиться этой страницей