PDA

Показать полную графическую версию : [решено] Как проверить наличие прав администратора


Dark_Timur
09-05-2012, 19:17
Как проверить наличие прав администратора в Windows без вывода окон для пользователя?

Delirium
10-05-2012, 01:30
net localgroup Администраторы
Команда выведет список локальных администраторов. Затем сравнить его с текущим пользователем. Вот и ответ. Или необходимо именно через VBS...?

Iska
10-05-2012, 03:19
WScript.Echo WScript.CreateObject("CompatUI.Util.1").CheckAdminPrivileges()
Правда, не знаю, остался ли объект «CompatUI.Util.1» в новых ОС.

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

Delirium
10-05-2012, 03:43
В семерке, похоже, уже нет:
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Users\firsov\Desktop\1.vbs
Строка: 1
Символ: 1
Ошибка: Не удается найти класс программируемых объектов с именем "CompatUI.Util.1".
Код: 80020009
Источник: WScript.CreateObject

---------------------------
ОК
---------------------------

Iska
10-05-2012, 05:26
В семерке, похоже, уже нет: »
Спасибо, ясно.

А ежели так попробовать:
Option Explicit

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

With WScript.CreateObject("WScript.Network")
Set objSWbemObjectEx = objSWbemServicesEx.Get( _
"Win32_NetworkLoginProfile.Name='" & _
.UserDomain & "\" & .UserName & "'")
End With

With objSWbemObjectEx
Select Case .Privileges
Case 0
WScript.Echo .Name & " is Guest"
Case 1
WScript.Echo .Name & " is User"
Case 2
WScript.Echo .Name & " is Administrator"
Case Else
' Impossible
End Select
End With

Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0


Судя по этому:

Win32_NetworkLoginProfile class (http://msdn.microsoft.com/en-us/library/windows/desktop/aa394221(v=vs.85).aspx)
NetUserGetInfo function (http://msdn.microsoft.com/en-us/library/windows/desktop/aa370654(v=vs.85).aspx)
USER_INFO_4 structure (http://msdn.microsoft.com/en-us/library/windows/desktop/aa371339(v=vs.85).aspx)

— что-то похожее. Delirium, Вам WinAPI ближе — посмотрите по ссылкам, гоже ли?! Ну, и — не знаю, как будет себя вести на машине без сети.

softter
10-05-2012, 13:58
Я когда-то делал так

Set wshshl = CreateObject("Wscript.Shell")

Пробовал создать ключ в разделе реестра

wshshl.RegWrite (параметры)

здесь
HKEY_LOCAL_MACHINE\SOFTWARE\Наш_подраздел\ключ

проверял наличие ключа
wshshl.RegRead (параметры)

Если ключ не создан, то нет прав на запись к HKEY_LOCAL_MACHINE, соотвественно не Админ.

Dark_Timur
10-05-2012, 20:05
Option Explicit

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

With WScript.CreateObject("WScript.Network")
Set objSWbemObjectEx = objSWbemServicesEx.Get( _
"Win32_NetworkLoginProfile.Name='" & _
.UserDomain & "\" & .UserName & "'")
End With

With objSWbemObjectEx
Select Case .Privileges
Case 0
WScript.Echo .Name & " is Guest"
Case 1
WScript.Echo .Name & " is User"
Case 2
WScript.Echo .Name & " is Administrator"
Case Else
' Impossible
End Select
End With

Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0

Работает на Windows XP/7. Сейчас попробую на Vista и 98

Iska
10-05-2012, 21:27
Dark_Timur, то, что работает — это-то было понятно. Вопрос в том, действительно ли сие есть именно то, что мы ожидаем. Потому мне хотелось бы, чтобы более опытные коллеги, работающие на уровень ниже, нежели скрипты, сопоставили приведённые мною выше (http://forum.oszone.net/post-1913230.html#post1913230) ссылки и высказали своё мнение на этот счёт.

Dark_Timur
10-05-2012, 23:08
Подвожу итоги:

Option Explicit

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

With WScript.CreateObject("WScript.Network")
Set objSWbemObjectEx = objSWbemServicesEx.Get( _
"Win32_NetworkLoginProfile.Name='" & _
.UserDomain & "\" & .UserName & "'")
End With

With objSWbemObjectEx
Select Case .Privileges
Case 0
WScript.Echo .Name & " is Guest"
Case 1
WScript.Echo .Name & " is User"
Case 2
WScript.Echo .Name & " is Administrator"
Case Else
' Impossible
End Select
End With

Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing

WScript.Quit 0

Мне этот вариант понравился больше всех. Выбрал именно его.

Windows 2000/XP/Vista/7: Работает
Windows 98: Не работает

Строка: 8
Столбец: 0
Категория: WScript.CreateObject
Описание Не удается найти класс объекта "WbemScripting.SWbemLocator".


WScript.Echo WScript.CreateObject("CompatUI.Util.1").CheckAdminPrivileges()

Windows XP: Работает
Windows 98/7: Не работает


---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Users\firsov\Desktop\1.vbs
Строка: 1
Символ: 1
Ошибка: Не удается найти класс программируемых объектов с именем "CompatUI.Util.1".
Код: 80020009
Источник: WScript.CreateObject

---------------------------
ОК
---------------------------


net localgroup Администраторы


В vbs это будет так:

WshShell.Run "net localgroup Администраторы"

Windows XP: Работает
Windows 98: Не работает. Пишет, что не умеет так делать.

Set wshshl = CreateObject("Wscript.Shell")

Пробовал создать ключ в разделе реестра

wshshl.RegWrite (параметры)

здесь
HKEY_LOCAL_MACHINE\SOFTWARE\Наш_подраздел\ключ

проверял наличие ключа
wshshl.RegRead (параметры)

Если ключ не создан, то нет прав на запись к HKEY_LOCAL_MACHINE, соотвественно не Админ.

Очень интересная идея. Спасибо. Не знаю, почему сам до этого не догадался.

Windows XP: Работает
Windows 98: Выдаёт ошибки.


Спасибо большое! Оказалось, что всё гениальное - просто. Тему закрываю, так как она исчерпала себя. Ещё раз большое спасибо!

morres
17-12-2012, 10:32
Ну, создавать ветку рееста или создавать локальную учетку (как предлагают на других форумах), на мой взгляд, совершенно, "не кошерно". Надо, всего лишь, перебрать почленно группу "Администраторы" на локальном компе и сравнить её членов с залогиненным пользователем. К сожалению, я не программер, поэтому прошу не судить строго, если код не столь оптимален и не универсален, но, проанализировав материаллы по этим двум ссылкам:
List local administrators across a network domain (http://ss64.com/vb/syntax-localadmins.html),
List User properties as displayed in ADUC (http://ss64.com/vb/syntax-userinfo.html),
у меня получилось следующее:Option Explicit
Dim strComp, objSysInfo, objLocalGroup, objUser, item
On Error Resume Next
strComp = "."
Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы")
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
For Each item in objLocalGroup.Members
if item.Name = objUser.sAMAccountName Then Wscript.Echo "User " _
& objUser.sAMAccountName & " have administrator rights!"
Next
WScript.Quit()

Iska
17-12-2012, 10:52
morres, как быть на машине без домена?

morres
19-12-2012, 09:02
morres, как быть на машине без домена? »
вот, еще порылся и вот этот вариант работает и на доменной машине, и на отдельной:Option Explicit
Dim strComp, objLocalGroup, WshNetwork, item
strComp = "."
Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы")
Set WshNetwork = WScript.CreateObject("WScript.Network")
For Each item in objLocalGroup.Members
if item.Name = WshNetwork.UserName Then Wscript.Echo "User " _
& WshNetwork.UserName & " have administrator rights!"
Next
WScript.Quit()Как проверить наличие прав администратора в Windows без вывода окон для пользователя? »Думаю, перенаправив вывод в файл, например, или цинично отсылая информационное письмо админам. ;)
Вот пример того, как информация записывается в файл:Option Explicit
Dim strComp, objLocalGroup, WshNetwork, item, objFS, objFile
strComp = "."
Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы")
Set WshNetwork = WScript.CreateObject("WScript.Network")
For Each item in objLocalGroup.Members
if item.Name = WshNetwork.UserName Then
Set objFS = CreateObject("Scripting.FileSystemObject")
if not objFS.FileExists("c:\admins.txt") Then
Set objFile = objFS.CreateTextFile("c:\admins.txt", True)
objFile.WriteLine(WshNetwork.UserName)
else
Set objFile = objFS.OpenTextFile("c:\admins.txt", 2)
objFile.WriteLine(WshNetwork.UserName)
end if
end if
Next
WScript.Quit()Только сразу хочу предупредить, данный скрипт не сработает, если пользователь входит в группу "Администраторы" по средствам другой группы (например доменной). Но в моей ситуации это и не нужно! Смысл в том, что не добросовестные сотрудники тех. поддержки (которые имеют админские права на всех рабочих станциях домена, как раз по средствам доменной группы HelpDesk) переодически, "чтобы не заморачиваться", добавляют пользователей в локальные администраторы. Ну, типа чтоб не париться с настройками софта, который "из коробки" не работает без админских прав. Либо, настраивают рабочее место пользователя, временно дав ему админа, потом забывают убрать его из админов. Вот эту ситуацию я желаю отслеживать и присекать, а соответственно, этот скрипт более подходящий для меня в качестве основы. Понятно, что в идеале, надо бы добавить проверку языка установленной ОС, т.к. в домене могут быть и англоязычные винды, соответствеено "Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы" не сработает! Надо бы оптимальнее спланировать "доставку" информации до админов и т.п. По этому, я подчёркиваю, что этот скрипт не идеален, но для меня он является основой дальнейшего развития. Если будет вдохновение и свободное время, то доделаю его в будущем...

Iska
19-12-2012, 10:55
morres, всё не то. Одно возражение Вы сами нашли:
Только сразу хочу предупредить, данный скрипт не сработает, если пользователь входит в группу "Администраторы" по средствам другой группы »

…добавляют пользователей в локальные администраторы. »
Эти вопросы всегда решались административными методами.

Понятно, что в идеале, надо бы добавить проверку языка установленной ОС, т.к. в домене могут быть и англоязычные винды, соответствеено "Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы" не сработает! »
Используйте SID групп: Хорошо известные идентификаторы безопасности в операционных системах Windows (http://support.microsoft.com/kb/243330/ru) для определения группы или её имени. В Вашем случае этого хватит. Ибо Вы ищете не наличие прав/привилегий администратора, а вхождение в определённые группы, прямо или опосредованно.




© OSzone.net 2001-2012