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

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.elevate"

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

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

reg delete "HKCU\Software\Classes\.elevate" /f >nul
del /q "%TEMP%\%~n0.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 )