Показать полную графическую версию : [решено] Как проверить наличие прав администратора
Dark_Timur
09-05-2012, 19:17
Как проверить наличие прав администратора в Windows без вывода окон для пользователя?
Delirium
10-05-2012, 01:30
net localgroup Администраторы
Команда выведет список локальных администраторов. Затем сравнить его с текущим пользователем. Вот и ответ. Или необходимо именно через VBS...?
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
---------------------------
ОК
---------------------------
В семерке, похоже, уже нет: »
Спасибо, ясно.
А ежели так попробовать:
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 ближе — посмотрите по ссылкам, гоже ли?! Ну, и — не знаю, как будет себя вести на машине без сети.
Я когда-то делал так
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
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: Выдаёт ошибки.
Спасибо большое! Оказалось, что всё гениальное - просто. Тему закрываю, так как она исчерпала себя. Ещё раз большое спасибо!
Ну, создавать ветку рееста или создавать локальную учетку (как предлагают на других форумах), на мой взгляд, совершенно, "не кошерно". Надо, всего лишь, перебрать почленно группу "Администраторы" на локальном компе и сравнить её членов с залогиненным пользователем. К сожалению, я не программер, поэтому прошу не судить строго, если код не столь оптимален и не универсален, но, проанализировав материаллы по этим двум ссылкам:
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()
morres, как быть на машине без домена?
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 & "/Администраторы" не сработает! Надо бы оптимальнее спланировать "доставку" информации до админов и т.п. По этому, я подчёркиваю, что этот скрипт не идеален, но для меня он является основой дальнейшего развития. Если будет вдохновение и свободное время, то доделаю его в будущем...
morres, всё не то. Одно возражение Вы сами нашли:
Только сразу хочу предупредить, данный скрипт не сработает, если пользователь входит в группу "Администраторы" по средствам другой группы »
…добавляют пользователей в локальные администраторы. »
Эти вопросы всегда решались административными методами.
Понятно, что в идеале, надо бы добавить проверку языка установленной ОС, т.к. в домене могут быть и англоязычные винды, соответствеено "Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы" не сработает! »
Используйте SID групп: Хорошо известные идентификаторы безопасности в операционных системах Windows (http://support.microsoft.com/kb/243330/ru) для определения группы или её имени. В Вашем случае этого хватит. Ибо Вы ищете не наличие прав/привилегий администратора, а вхождение в определённые группы, прямо или опосредованно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.