1 (изменено: mozers, 2015-12-20 22:00:07)

Тема: HTA: "Run as Administrator"

<html>
<head>
<hta:application id="App" />
<script type="text/javascript">
	function RunAs(){
		var Shell = new ActiveXObject("Shell.Application");
		Shell.ShellExecute ('mshta', App.commandLine, "", "runas", 1);
		self.close();
	}
</script>
</head>
<body>
<input type="button" value="Run as Administrator" onclick="RunAs()" />

<script type="text/javascript">
	var oSWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
	var oWMIService = oSWbemLocator.ConnectServer('.', 'ROOT\\CIMV2'); 
	colItems = oWMIService.ExecQuery ('SELECT * FROM Win32_Process');
	var enumItems = new Enumerator(colItems);
	document.write('<table border="1"><tr><th>Name<th>Owner<th>Command Line');
	for (; !enumItems.atEnd(); enumItems.moveNext()) {
		var oItem = enumItems.item();
		document.write('<tr><td>' + oItem.Name);
		document.write('<td>&nbsp;');
		try {
			var oOwner = oItem.ExecMethod_("GetOwner", null);
			if (oOwner.User) document.write(oOwner.Domain + '\\' + oOwner.User);
		} catch(e) {}
		document.write('<td>' + oItem.CommandLine);
	}
	document.write('</table>');
</script>
</body>
</html>

Вот такой демонстрационный скрипт выводит список процессов (имя, владелец, ком.строка).
Кнопочка сверху "Run as Administrator" перезапускает приложение с повышением прав.
Хочу быть точным. Действие "Run as Administrator" не соответствует действительности, как не соответствует действительности одноименный пункт контекстного меню Windows, поскольку при выборе данного действия, фактически происходит запуск приложения не под учеткой локального администратора, а под учетной записью текущего пользователя, но в режиме повышенных прав.
Результат этого действия в представленном скрипте виден налицо. Если со своей учеткой (пусть даже обладающей админскими правами) вы видели детали только ваших процессов, то после перезапуска с повышенными привилегиями вы можете видеть детали практически всех процессов в системе.
Мысль о добавлении функции "Run as Administrator" в свои скрипты пришла ко мне вместе с установкой Windows 10. Если в прежних операционках пользователь с правами администратора имел все положенные администратору права, то в Windows 10 (возможно и в Windows 8 - я с ней мало занимался) администратор фактически почти такой же бесправный юзер как и все остальные и лишь запуск "Run as Administrator" делегирует ему положенное.
Остался нерешенным лишь один вопрос:
Как из скрипта однозначно определить с какими правами он запущен (с обычными или повышенными)? (Не хочется тупо проверять есть или нет доступ к свойствам какого нибудь системного процесса и на этом строить вывод. Может есть какой то системный признак?).
Кстати, вот Total Commander, будучи запущен в режиме повышенных прав покаывает в заголовке имя пользователя со значком ^.
Cmd.exe тоже "показывает", но вместо имени пользователя тупо пишет в заголовке "Администратор".

Ну что, уважаемые господа скриптописатели, может и вам пришла пора все свои скрипты дописывать?

2

Re: HTA: "Run as Administrator"

mozers пишет:

Ну что, уважаемые господа скриптописатели, может и вам пришла пора все свои скрипты дописывать?

Что именно дописывать? Возможность запуска скриптов с повышенными правами? Так это забота не скриптов, а системы и решение пользователя, который их запускает.

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

3

Re: HTA: "Run as Administrator"

На Win7 Enterprise SP1 ошибка при переходе в "админский режим":


Line: 24
Char: 3
Error: Not found
Code: 0
URL: file:///Z:/mozers.hta
( 2 * b ) || ! ( 2 * b )

4

Re: HTA: "Run as Administrator"

2Rumata
Обернул извлечение владельца в try-catch. Надеюсь это устранит ошибку.

Rumata пишет:

Что именно дописывать? Возможность запуска скриптов с повышенными правами?

Да. Я именно про это. Просто раньше я был уверен что у пользователя с админскими правами все будет как надо. Теперь такой уверенности нет.
Думаю стоит в скрипты встраивать проверку на наличие повышенных прав и если они отсутствуют то сразу перезапускать скрипт с повышенными правами.
Во всяком случае я не понимаю почему Sysinternals Process Explorer сразу показывает детали процессов. Объяснение одно - он, когда я его запускаю без повышенных прав, сам себя перезапускает.

5

Re: HTA: "Run as Administrator"

Не про Sysinternals Process Explorer - наврал. Он просто без повышенных прав пишет в строках <access denied>.
Ну если такие монстры как Марк Русинович отступили то и я не буду все свои скрипты наделять повышенными правами.

6

Re: HTA: "Run as Administrator"

Ищу хороший код надежного определения текущих прав.
Смотрю, а тема то уже поднималась. К сожалению, ни один из вариантов не выдерживает критики
Случайно набрёл на приятную статейку про разницу между запуском под администратором и запуском "Run as Administrator".

7 (изменено: mozers, 2016-01-12 22:09:23)

Re: HTA: "Run as Administrator"

Придумал решение, позволяющее запустить любую программу или скрипт с командной строки в режиме повышенных прав:
Создаем в каталоге windows ярлык с именем sudo. В качестве расположения указываем

cmd /c start ""

или так

rundll32.exe shell32.dll,ShellExec_RunDLL

В дополнительных свойствах ярлыка ставим галку на "Запуск от имени администратора". Все

Теперь любую прогу или скрипт можно запустить с повышенными правами командой sudo c:\path\anyprog.vbs.
Если команду sudo использовать из батника, то необходимо писать sudo.lnk. Указание пути не требуется. И кавычки при указании пути к запускаемой программе/скрипту не обязательны (наш sudo читает всю строку до конца).

8

Re: HTA: "Run as Administrator"

mozers
Так вопрос стоял в определении наличия повышения.
Если достаточно самого повышения без мешающей консоли, то уже давно есть своя Sudo.
А в ТС так вообще достаточно * в начале поля Команда:.

9

Re: HTA: "Run as Administrator"

Flasher
Решение с запуском, без использования сторонних программ, показалось интересным вот и поделился.
Так же интересной и познавательной считаю твою информацию про * в командной строке TC и про утилитку Sudo.
А вопрос в определении повышенных прав по прежнему актуален.

10

Re: HTA: "Run as Administrator"

mozers пишет:

про * в командной строке TC

Командной строки как элемента окна это не касается. Хотя для неё можно создать любой псевдоним с *mshta.exe и %A в параметрах.

11

Re: HTA: "Run as Administrator"

Избавился от консольного окошка в моей самодельной sudo и исправил свой предыдущий пост.
Кстати, работать с таким sudo гораздо удобнее чем со * Total Commander или с одноименной утилитой, т.к. для запуска с их помощью скриптов необходимо обязательное указание обработчика. Моя же sudo сама находит ассоциированный с файлом обработчик

Нашел достаточно много вариантов определения повышенных прав. Выбрал вариант записи в реестр, как наиболее простой и надежный к тому же не использующий результат работы консольных утилит. Итого test.hta получился таким:

<html>
<head>
<hta:application
 id="App"
 icon="UserAccountControlSettings.exe"
 />
<script type="text/javascript">
	function RunAs(){
		var Shell = new ActiveXObject("Shell.Application");
		Shell.ShellExecute ('mshta', App.commandLine, "", "runas", 1);
		self.close();
	}
	function IsElevation(){
		var WshShell = new ActiveXObject("WScript.Shell");
		try {
			WshShell.RegWrite("HKLM\\elvt", "");
			WshShell.RegDelete("HKLM\\elvt");
			return true;
		} catch(e) {}
	}
	function ShowUserPrivs(){
		var WshNetwork = new ActiveXObject("WScript.Network");
		App.document.title = "Run as " + WshNetwork.UserDomain + "\\" + WshNetwork.UserName + (IsElevation() ? " (with Elevated Privilegs)" : " (User)");
	}
</script>
</head>
<body>
<input type="button" value="Run as Administrator" onclick="RunAs()" /><br />

<script type="text/javascript">
	ShowUserPrivs();
	var oSWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
	var oWMIService = oSWbemLocator.ConnectServer('.', 'ROOT\\CIMV2'); 
	colItems = oWMIService.ExecQuery ('SELECT * FROM Win32_Process');
	var enumItems = new Enumerator(colItems);
	document.write('<table border="1"><tr><th>Name<th>Owner<th>Command Line');
	for (; !enumItems.atEnd(); enumItems.moveNext()) {
		var oItem = enumItems.item();
		document.write('<tr><td>' + oItem.Name);
		document.write('<td>&nbsp;');
		try {
			var oOwner = oItem.ExecMethod_("GetOwner", null);
			if (oOwner.User) document.write(oOwner.Domain + '\\' + oOwner.User);
		} catch(e) {}
		document.write('<td>' + oItem.CommandLine);
	}
	document.write('</table>');
</script>
</body>
</html>

12

Re: HTA: "Run as Administrator"

mozers пишет:

Кстати, работать с таким sudo гораздо удобнее чем со * Total Commander или с одноименной утилитой

Ну, да. Пока дело не дошло до необходимости запуска программ с флешки. >>>

mozers пишет:

Создаем в каталоге windows ярлык

Поэтому для меня не вариант.

13

Re: HTA: "Run as Administrator"

Правильней было бы написать "создаём в любом из каталогов, описанных в %PATH%". Делается это только зачем, чтобы каждый раз не писать путь к sudo.lnk. Т.е. sudo.lnk, весом в 1кБ, созданный собственными руками, ничем не хуже других прог данного предназначения.

14

Re: HTA: "Run as Administrator"

Пардон, у меня почему-то после пути ещё имя rundll32 подвязалось, в результате получал:

Ошибка в rundll32.exe
Нет точки входа: shell32.dll,ShellExec_RunDLL

А насчёт "не писать полный путь" при переноске в ТС решаемо тем же псевдонимом или созданной внутренней переменной. Т.ч. всё гуд. Спасибо за фичу с non-exe.