1 (изменено: Rumata, 2020-02-09 13:41:38)

Тема: CMD/BAT: Sudo or Run as Administrator

После перехода на WIN10 у меня стало меньше возможностей запустить командную строку с повышенными правами. Это было печально. При этом разработчики решили, что PowerShell круче, чем cmd.exe. Возможно, но второй удобнее. Кроме того почему-то разработчики решили ограничить в такой удобной возможности как создание символических ссылок, которая выполняется ТОЛЬКО с повышенными правами. Пришлось немного попотеть и поискать обходные пути. И нашел. Ссылкой поделиться не смогу -- забыл я ее уже среди десятка самых разных. Да и поиски мои были направлены на решение задачи по добавлению команды вызова интерпретатора из контекстного меню Проводника.

Скрипт очень простой. По умолчанию запускает интерпретатор. Можно указать другую команду с параметрами. Иногда возможны ошибки. Но уже сейчас можно работать.


:: SUDO [command [options]]
::
:: Mimic to the unix command with the same name
:: Allow to run a command with the elevated privileges
@echo off

if "%~1" == "" (
	call "%~f0" cmd.exe "/s /k cd /d \"%cd%\""
	goto :EOF
)

PowerShell -Command Start-Process "%~1" -Args '%2 %3 %4 %5 %6 %7 %8 %9' -Verb RunAs

Аналогичные темы на форуме:
VBS: Ярлык для запуска приложения от имени администратора (UAC)
HTA: "Run as Administrator"

( 2 * b ) || ! ( 2 * b )

2 (изменено: Rumata, 2020-02-09 09:11:27)

Re: CMD/BAT: Sudo or Run as Administrator

Продолжаем разговор... Внес существенные улучшения без усложнения кода.

Способы вызова

1. новая копия интерпретатора

sudo

2. с пакетным скриптом

sudo path-to-batch-file [options]

3. с любой командой или файлом

sudo app-or-file [options]

Новая версия с проверкой требований и поддержкой опций для вывода помощи /? и /h


::NAME
::
::    sudo - execute a command with the elevated privileges
::
::SYNOPSIS
::
::    sudo
::    sudo COMMAND [OPTIONS]
::
::DESCRIPTION
::
::sudo allows to run a command with optional arguments with the elevated
::privileges. By default, if no any options specified, it runs the
::command interpreter. The command can be any of binary executables,
::batch scripts or documents supposed to be open.
::
::REQUIREMENTS
::
::The script requires PowerShell to be installed on the system.
@echo off

if /i "%~1" == "/?" goto :print_usage
if /i "%~1" == "/h" goto :print_usage

call :check_reqs || goto :EOF

setlocal

set "SUDO_HIDDEN="

if "%~1" == "" (
	call :sudo /s /k cd /d "%CD%"
	goto :EOF
)

for %%x in ( .bat .cmd ) do if /i "%~x1" == "%%x" (
	call :sudo /s /k cd /d "%CD%" "&&" %*
	goto :EOF
)

set "SUDO_HIDDEN=-WindowStyle Hidden"
call :sudo /c start /d "%CD%" %*

goto :EOF


:sudo
endlocal && powershell -Command Start-Process "cmd.exe" -Args '%*' %SUDO_HIDDEN% -Verb RunAs
goto :EOF


:print_usage
for /f "tokens=* delims=:" %%s in ( 'findstr "^::" "%~f0"' ) do echo:%%s
goto :EOF


:check_reqs
for %%p in ( powershell.exe ) do if "%%~$PATH:p" == "" (
	echo:%%~p is required>&2
	exit /b 1
)
goto :EOF
( 2 * b ) || ! ( 2 * b )

3

Re: CMD/BAT: Sudo or Run as Administrator

Скрипт требует наличия в системе PowerShell.

Тестировал только на 64-битной Window 10 Enterprise. Других в наличии нет.

( 2 * b ) || ! ( 2 * b )

4

Re: CMD/BAT: Sudo or Run as Administrator

Поправил все скрипты в данном теме -- добавил ключ в команде CD /D.

( 2 * b ) || ! ( 2 * b )

5 (изменено: Rumata, 2020-06-20 12:10:17)

Re: CMD/BAT: Sudo or Run as Administrator

Две новости, из-за которых я решил отказаться от поддержки своего творения
1. обнаружил, что по каким-то причинам мой скрипт не работает в корне диска (любого)
2. есть лучшее решение, которое проще и элегантнее

Решение, найдено на форуме DosTips: SUDO for CMD:

Суть решения:
1. создается фиктивное расширение .elevate
2. создается ассоциация, которая запускает CMD с повышенными правами
3. запускается команда или открывается файл


::NAME
::
::    sudo - execute a command with the elevated privileges
::
::SYNOPSIS
::
::    sudo
::    sudo COMMAND [OPTIONS]
::
::DESCRIPTION
::
::sudo allows to run a command with optional arguments with the elevated
::privileges. By default, if no any options specified, it runs the
::command interpreter. The command can be any of binary executables,
::batch scripts or documents supposed to be open.
::
::Based on the solution suggested in this thread:
::https://www.dostips.com/forum/viewtopic.php?f=3&t=9212
@echo off

if /i "%~1" == "/?" goto :print_usage
if /i "%~1" == "/h" goto :print_usage

call :check_reqs || goto :EOF

type nul >"%TEMP%\%~n0.%USERNAME%.elevate"

reg add "HKCU\Software\Classes\.elevate\shell\runas\command" /ve /d "cmd.exe /c cd /d \"%%w\" & start \"%~n0\" %%*" /f >nul

"%TEMP%\%~n0.%USERNAME%.elevate" %*

reg delete "HKCU\Software\Classes\.elevate" /f >nul
del /q "%TEMP%\%~n0.%USERNAME%.elevate"

goto :EOF


:print_usage
for /f "tokens=* delims=:" %%s in ( 'findstr "^::" "%~f0"' ) do echo:%%s
goto :EOF


:check_reqs
for %%p in ( reg.exe ) do if "%%~$PATH:p" == "" (
	echo:%%~p is required>&2
	exit /b 1
)
exit /b 0
( 2 * b ) || ! ( 2 * b )

6

Re: CMD/BAT: Sudo or Run as Administrator

Поправил предыдущий пост. Улучшения:
-- start "%~n0". чтобы можно было запускать команды в кавычках
-- избыточная надежность в %TEMP%\%~n0.%USERNAME%.elevate

Хотелось бы сделать так, чтобы команда (например, cmd.exe) работала в том окне, но, видимо, данными средствами это не возможно.

( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Sudo or Run as Administrator

Улучшил код, показывающий привилегии текущей консоли.


::NAME
::
::    sudo - check privileges or run a command with the elevated privileges
::
::SYNOPSIS
::
::Check privileges
::    sudo /c
::
::Run a command with the elevated privileges
::    sudo
::    sudo COMMAND [OPTIONS]
::
::DESCRIPTION
::
::sudo allows to run a command with optional arguments with the elevated
::privileges. By default, if no any options specified, it runs the
::command interpreter. The command can be any of binary executables,
::batch scripts or documents supposed to be open.
::
::Based on the solutions suggested in these threads:
::https://www.dostips.com/forum/viewtopic.php?f=3&t=9212
::https://stackoverflow.com/a/27717205/3627676
::https://stackoverflow.com/a/30921854/3627676
@echo off

if /i "%~1" == "/?" goto :print_usage
if /i "%~1" == "/h" goto :print_usage
if /i "%~1" == "/c" goto :check_priv

call :check_reqs reg.exe || goto :EOF

type nul >"%TEMP%\%~n0.%USERNAME%.elevate"

reg add "HKCU\Software\Classes\.elevate\shell\runas\command" /ve /d "cmd.exe /c cd /d \"%%w\" & start \"%~n0\" %%*" /f >nul

"%TEMP%\%~n0.%USERNAME%.elevate" %*

reg delete "HKCU\Software\Classes\.elevate" /f >nul
del /q "%TEMP%\%~n0.%USERNAME%.elevate"

goto :EOF


:print_usage
for /f "tokens=* delims=:" %%s in ( 'findstr "^::" "%~f0"' ) do echo:%%s
goto :EOF


:check_reqs
for %%p in ( "%~1" ) do if "%%~$PATH:p" == "" (
	echo:%%~p is required>&2
	exit /b 1
)
exit /b 0


rem 2.4.2.4 Well-Known SID Structures
rem https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/81d92bba-d22b-4a8c-908a-554ab29148ab
:check_priv
setlocal

set "S-1-16-0=untrusted"
set "S-1-16-4096=low"
set "S-1-16-8192=medium"
set "S-1-16-8448=medium-plus"
set "S-1-16-12288=high"
set "S-1-16-16384=system"
set "S-1-16-20480=protected"
set "S-1-16-28672=secure"

for /f "tokens=2" %%a in ( '
	call "%SystemRoot%\system32\whoami.exe" /groups /fo list ^| findstr /e S-1-16-[0-9]*
' ) do if defined %%~a (
	call echo:%%%%~a%%
	goto :EOF
)

echo:unknown
goto :EOF
( 2 * b ) || ! ( 2 * b )

8

Re: CMD/BAT: Sudo or Run as Administrator

Rumata, позвольте полюбопытствовать для чего вам такие сложности? Возьмите планировщик, нарисуйте в нём задачу запуска консоли с повышенными правами, а после нарисуйте для составленной задачи макрос (sudo=>nul schtasks /run /tn <имя_задачи>). Относительно данного подхода у каждого найдётся свой контраргумент, тем не менее как вариант - вполне имеет право на жизнь.
В качестве альтернативы можно посмотреть в сторону gsudo, хотя в целом на pwsh можно изготовить аналог sudo в прямом смысле на коленке, а чтобы проверить запущен ли его хост с повышенными привилегиями, достаточно прочитать данные из KUSER_SHARED_DATA.

9

Re: CMD/BAT: Sudo or Run as Administrator

greg zakharov пишет:

gsudo

Это хорошая программа. Пользуюсь ей. Только версия у меня очень старая, 0.7.2. Самое время обновить, там много хорошего добавилось.

( 2 * b ) || ! ( 2 * b )