1

Тема: VBS: WMI & UAC (определение прав)

Доброго времени суток господа. Собираю установщик под XP / Vista / Windows 7. Возник вопрос - Как скриптом через WMI узнать - запущен ли скрипт от администратора или нет (т.е с повышенными правами) ? Нашёл пример как это делать через whoami утилиту, но такой способ мне кажется не очень красив.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

2

Re: VBS: WMI & UAC (определение прав)

Про WMI не знаю, но в библиотеке AutoItX есть функция IsAdmin.

В основе всего лежит простота.

3

Re: VBS: WMI & UAC (определение прав)

2 Felix Faria: Благодарю . Я про неё знаю, но мне всё же хотелось бы сделать это через WMI или какой либо другой объект, без появления посторонних окон. Вариант со скрытой консолью тоже не подошёл.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

4 (изменено: Felix Faria, 2011-06-10 14:22:05)

Re: VBS: WMI & UAC (определение прав)

Ещё вот нашёл, сам думал нечто подобное использовать. Вдруг сойдет:
http://stackoverflow.com/questions/3018 … a-vbscript

Из WMI про учётную запись нашёл только это: http://msdn.microsoft.com/en-us/library … s.85).aspx, хотя я не разобрался, есть ли тут в свойствах параметр, показывающий наличие соответствующих прав.

В основе всего лежит простота.

5

Re: VBS: WMI & UAC (определение прав)

Я так проверяю:

regread("HKEY_USERS\S-1-5-19\Environment\TEMP")
If InStr(val,"Temp") Then
'...есть
Else 
'...нет
End If

батником:

@echo off
setlocal enableextensions enabledelayedexpansion

call :IsAdminTest IsAdmin

echo IsAdmin=%IsAdmin%

endlocal
exit /b 0

:IsAdminTest
    setlocal enableextensions enabledelayedexpansion
    
    "%systemroot%\system32\reg.exe" query "HKU\S-1-5-19" 1>nul 2>nul && set IsAdmin=1 || set IsAdmin=0
    
    endlocal & set /a %~1=%IsAdmin%
    exit /b 0

6

Re: VBS: WMI & UAC (определение прав)

2 Felix Faria: Обе ссылки бесполезны. К UAC не имеют отношения.
1) На моей русскоязычной системе не выполняется скрипт, т.к у меня нет группы Administrators, а есть Администраторы. Но даже исправление не даёт определить - включен UAC или нет, а только лишь определить - входит ли user в группу администраторов или нет.
2) Вторая ссылка даёт информацию только о пренадлежности пользователя к группам.

Всё это я так же уже видел... И к сожалению ни чем это не помогло. Пробывал читать через реестр, но этот способ плох тем, что не чётко идентифицирует состояние UAC, т.к значение может быть заблокировано от чтения, либо изменено вручную, а перезагрузка системы не произведена.


Function GetUACState()
    On Error Resume Next
    GetUACState = 0
    GetUACState = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA")
End Function

2 abasov: Вообще не понял смысл этих действий. Что это даёт ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7 (изменено: Felix Faria, 2011-06-10 15:14:43)

Re: VBS: WMI & UAC (определение прав)

2 Xameleon: Всё-таки есть решение через WMI. Надеюсь, это то, что вам нужно:

Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
For Each objOS In objService.ExecQuery("SELECT * FROM Win32_NetworkLoginProfile")
	If (objOS.UserType="Normal Account") Then
		If (objOS.Privileges=2) Then
			WScript.Echo objOS.Caption&" is Administrator"
		ElseIf (objOS.Privileges=1) Then 
			WScript.Echo objOS.Caption&" is User"
		Else 
			WScript.Echo objOS.Caption&" is Guest"
		End If 
	End If 
Next

Справка здесь.

В основе всего лежит простота.

8

Re: VBS: WMI & UAC (определение прав)

2 Felix Faria Вы не понимаете о чём я спрашиваю ? Я говорю об определении необходимости повышения прав запуска - UAC Elevation. Вы же упорно скидываете примеры и ссылки на определение пренадлежности пользователя разным группам ? Вы с Windows 7 знакомы ? Пользователь может быть администратором на компьютере, но при включенном UAC получать запрос на разрешение внесения изменений в компьютере при запуске приложения.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: VBS: WMI & UAC (определение прав)

Xameleon, только с помощью WMI Вы, скорее всего, не сможете решить указанную задачу.
Кстати, думается, что надо интересоваться уровнем привилегий не текущего пользователя системы, а пользователя, от имени которого запущен процесс установки приложения.

Felix Faria, вариант с использованием класса Win32_NetworkLoginProfile никак не подходит. Например, моя "учётка" входит в группу локальных администраторов, но уровень привилегий идентифицируется как пользовательский.

10

Re: VBS: WMI & UAC (определение прав)

2 Dmitrii:

Dmitrii пишет:

Xameleon, только с помощью WMI Вы, скорее всего, не сможете решить указанную задачу.

А жаль..

Dmitrii пишет:

Кстати, думается, что надо интересоваться уровнем привилегий не текущего пользователя системы, а пользователя, от имени которого запущен процесс установки приложения.

Именно !

Я думал попробывать какими нибудь косвенными способами определить включеный UAC, но пока найденые варианты не устраивают.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: VBS: WMI & UAC (определение прав)

Xameleon пишет:

... Именно !..

С этим проблемы имеются (речь, разумеется, о WMI-реализации)?

12

Re: VBS: WMI & UAC (определение прав)

Dmitrii, на самом деле для меня не столь важно каким способом, лишь бы не было посторонник моргающих окон. А уж WMI или не WMI особой роли не играет. В том примере о котором я говорил - http://csi-windows.com/toolkit/ifuserperms появляется чёрное окно, т.к запускается консоль и выполняется программа whomai. Пробывал с невидимой консолью это делать. Неудобно.

Подумываю о том, чтобы в том же примере сделать Run с параметром скрытия приложения, вместо Exec, а из команды возвращать errorlevel. Или как то так. Но пока не особо получается.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

13

Re: VBS: WMI & UAC (определение прав)

Порывшись в MSDN нашёл следующее:

Scripts cannot determine programmatically whether they are running under a standard user security token or an Administrator token. The script may fail with an access denied error. If the script requires administrator privileges, then it must be run in the elevated mode.

Иными словами, надо решать не задачу определения уровня привилегий, а задачу запуска процесса с заведомого достаточными привилегиями.
Впрочем, здесь речь о сценариях. Коль скоро механизм реализации Вам безразличен, то, возможно, имеет смысл задействовать (для решения исходной задачи) WinAPI.

14

Re: VBS: WMI & UAC (определение прав)

http://www.itwriting.com/blog/198-c-cod … vista.html C# code to detect UAC elevation on Vista

Нагуглил пример на C#, мол, определяющего наличие повышения прав процесса. Может пригодится...

WBR. Roman

15

Re: VBS: WMI & UAC (определение прав)

Dmitrii

Dmitrii пишет:

Коль скоро механизм реализации Вам безразличен, то, возможно, имеет смысл задействовать (для решения исходной задачи) WinAPI.

Нет нет, я рассматриваю только скриптовые варианты. API вызвать проблем нет и код я написать могу и с сишного кода в VB-ный конвертнуть могу, но просто не эстетично как то. ) Решил остановиться на проверке версии ОС и под Windows 7 и Vista просто проверять значение в реестре. Думаю этого вполне будет достаточно. )

Dmitrii, Rom5 Благодарю за информацию. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16 (изменено: Alexey, 2011-06-11 09:31:17)

Re: VBS: WMI & UAC (определение прав)

Я для себя  делал через whoami без всплывающих окон


Function CheckPerms4(perms)
	on error resume next
	CheckPerms4=true
	Const admin="S-1-5-32-544"
	Const elevated="S-1-16-12288"
	Set fso = CreateObject("Scripting.Filesystemobject")
	Set WshShell = CreateObject("Wscript.Shell")
	Set RExp = CreateObject("VBScript.RegExp")
	temp_file=fso.GetSpecialFolder(0)&"\"&fso.GetTempName
	ret=WshShell.Run("cmd /c whoami /groups >"""&temp_file&"""",0,true)
	RExp.Global=True
	Select Case UCase(perms)
	Case "ADMIN"
		RExp.Pattern=admin
	Case "ELEVATED"
		RExp.Pattern=elevated
	End Select
	CheckPerms4=RExp.Test(fso.OpenTextFile(temp_file).ReadAll)
	fso.DeleteFile temp_file
	Set fso = Nothing
	Set WshShell = Nothing
	Set RExp = Nothing
	on error goto 0
End Function

17

Re: VBS: WMI & UAC (определение прав)

Одним из простых вариантов проверки на наличие повышенных прав  является попытка создать текстовый файл в корне системного раздела.

function isElevated()
{
  var e, f=GetSystemDrive()+RandomFileName();
  try{ CreateTextFile(f); FSO.DeleteFile(f);}
  catch (e) {return false;}
  return true;
}