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

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
8,002
Решения
15
Реакции
6,795
Шаблон для ответа на форуме (для всех версий операционных систем):
Нажмите комбинацию клавиш Ctrl + Esc (удерживая кнопку Ctrl, нажмите Esc)
Введите английскими cmd и нажмите комбинацию Ctrl + Shift + ENTER (удерживая одновременно Ctrl и Shift, нажмите Enter)

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

Способ 1.


Нажимаем ПУСК (клавишу Win или комбинацию клавиш Ctrl + 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


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

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

Adm_Click.png


Ссылки по теме:
В. Стеркин Как открыть командную строку от имени администратора в нужной папке
В. Стеркин Как открывать файлы из контекстного меню с полными правами
 
Последнее редактирование:
Как работает контроль учетных записей пользователей

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

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

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

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

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

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

UAC_Alert_Window.webp

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

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


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

UAC_Settings.webp

Ссылки по теме:
MSDN Что такое контроль учетных записей пользователей?
MSDN Параметры контроля учетных записей
Wikipedia Контроль учётных записей пользователей
В. Стеркин Так ли страшен контроль учетных записей?
 
Элевация прав запуска BAT-файла (отображается диалог контроля учетных записей UAC)

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

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

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

CMD/BATCH:
@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-файл, но уже с повышенными привилегиями.

CMD/BATCH:
@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
Код очень похож:

CMD/BATCH:
@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);

CMD/BATCH:
:: Но если все-таки хочется что-то дописать в конец файла
:: Последние строки можно изменить так:
:: (снова открываем многострочный комментарий)

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

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

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

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

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

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

CMD/BATCH:
@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

*/
 

Вложения

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

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

VB.NET / VBA:
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 за ссылку на крутой скрипт :)
 
Последнее редактирование:
Как определить визуально, запущена ли командная строка с повышенными привилегиями:

ADMIN_CMD.webp


Заголовок окна должен начинаться со слов:
для RU-систем: "Администратор: "
для EN-систем: "Administrator: "

Добавлено позже: указанное в этой заметке не всегда правда. В некоторых сценариях запущенный "От имени Администратора" батник может не иметь префикса "Администратор:" в заголовке окна.
На системах Windows XP, а также Windows 7 и выше можно попытаться перетащить любой файл из проводника на окно консоли. Если в консоли не отобразится путь к этому файлу, значит она запущена с повышенными привилегиями. Прим.: при этом проводник должен быть запущен с обычными правами.
 
Последнее редактирование:
Как проверить в коде, запущен ли батник с повышенными правами

Вариант:
Код:
net continue winmgmt 2>&1| find "5" && (echo not admin)
 
Окошки немного другие, а по порядку действий всё идентично.
 
Назад
Сверху Снизу