• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#1
Шаблон для ответа на форуме (для всех версий операционных систем):
Нажмите комбинацию клавиш 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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#2
Как работает контроль учетных записей пользователей

В системах 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 Контроль учётных записей пользователей
В. Стеркин Так ли страшен контроль учетных записей?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#3
Элевация прав запуска 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
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#4
Полезный скрипт:

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

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

*/
 

Вложения

Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#5
Запуск 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 за ссылку на крутой скрипт :)
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#6
Как определить визуально, запущена ли командная строка с повышенными привилегиями:

ADMIN_CMD.png

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

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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,734
Симпатии
5,638
#7
Как проверить в коде, запущен ли батник с повышенными правами

Вариант:
Код:
net continue winmgmt 2>&1| find "5" && (echo not admin)
 
Сверху Снизу