Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Как проверить наличие прав администратора (http://forum.oszone.net/showthread.php?t=234328)

Dark_Timur 09-05-2012 19:17 1913150

Как проверить наличие прав администратора
 
Как проверить наличие прав администратора в Windows без вывода окон для пользователя?

Delirium 10-05-2012 01:30 1913209

Цитата:

net localgroup Администраторы
Команда выведет список локальных администраторов. Затем сравнить его с текущим пользователем. Вот и ответ. Или необходимо именно через VBS...?

Iska 10-05-2012 03:19 1913218

Код:

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

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

Delirium 10-05-2012 03:43 1913221

В семерке, похоже, уже нет:
Цитата:

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

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

Iska 10-05-2012 05:26 1913230

Цитата:

Цитата Delirium
В семерке, похоже, уже нет: »

Спасибо, ясно.

А ежели так попробовать:
Код:

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
NetUserGetInfo function
USER_INFO_4 structure

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

softter 10-05-2012 13:58 1913411

Я когда-то делал так

Set wshshl = CreateObject("Wscript.Shell")

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

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

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

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

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

Dark_Timur 10-05-2012 20:05 1913618

Цитата:

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 1913664

Dark_Timur, то, что работает — это-то было понятно. Вопрос в том, действительно ли сие есть именно то, что мы ожидаем. Потому мне хотелось бы, чтобы более опытные коллеги, работающие на уровень ниже, нежели скрипты, сопоставили приведённые мною выше ссылки и высказали своё мнение на этот счёт.

Dark_Timur 10-05-2012 23:08 1913724

Подвожу итоги:

читать дальше »
Цитата:

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 2047041

Ну, создавать ветку рееста или создавать локальную учетку (как предлагают на других форумах), на мой взгляд, совершенно, "не кошерно". Надо, всего лишь, перебрать почленно группу "Администраторы" на локальном компе и сравнить её членов с залогиненным пользователем. К сожалению, я не программер, поэтому прошу не судить строго, если код не столь оптимален и не универсален, но, проанализировав материаллы по этим двум ссылкам:
List local administrators across a network domain,
List User properties as displayed in ADUC,
у меня получилось следующее:
Код:

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 2047054

morres, как быть на машине без домена?

morres 19-12-2012 09:02 2048585

Цитата:

Цитата Iska
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()

Цитата:

Цитата Dark_Timur
Как проверить наличие прав администратора в 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 2048665

morres, всё не то. Одно возражение Вы сами нашли:
Цитата:

Цитата morres
Только сразу хочу предупредить, данный скрипт не сработает, если пользователь входит в группу "Администраторы" по средствам другой группы »

Цитата:

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

Эти вопросы всегда решались административными методами.


Цитата:

Цитата morres
Понятно, что в идеале, надо бы добавить проверку языка установленной ОС, т.к. в домене могут быть и англоязычные винды, соответствеено "Set objLocalGroup = GetObject("WinNT://" & strComp & "/Администраторы" не сработает! »

Используйте SID групп: Хорошо известные идентификаторы безопасности в операционных системах Windows для определения группы или её имени. В Вашем случае этого хватит. Ибо Вы ищете не наличие прав/привилегий администратора, а вхождение в определённые группы, прямо или опосредованно.


Время: 15:28.

Время: 15:28.
© OSzone.net 2001-2025