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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Win32_Account и Win32_SID помогите разобраться (http://forum.oszone.net/showthread.php?t=235225)

foxbat 23-05-2012 16:16 1921109

Win32_Account и Win32_SID помогите разобраться
 
Цитата:

On Error Resume Next
const HKEY_USERS = &H80000003
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number <> 0 Then
WScript.Echo Err.Number & ": " & Err.Description
WScript.Quit
End If
intRes = objReg.EnumKey(HKEY_USERS, "", sNames)
If intRes <> 0 Then
WScript.Echo intRes & ": не удалась прочитать подразделы ""HKEY_USERS\" & strKey & """"
WScript.Quit
End If
If IsArray(sNames) Then
For Each strSubKey In sNames
ReadKey strKey & "\" & strSubKey
'wscript.echo(strSubKey)
If strSubKey="S-1-5-21-3542024261-4289602802-4269527428-1311" Then
WScript.Echo "catch"

Else strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
'Set objAccount = objWMIService.Get("Win32_SID.SID='"&strsubkey&"'")
Set objAccount = objWMIService.Get("Win32_Account.SID='"&strsubkey&"'")
Wscript.Echo objAccount.SID

End If
Next
End If
споткнулся на этом

Цитата:

'Set objAccount = objWMIService.Get("Win32_SID.SID='"&strsubkey&"'")
Set objAccount = objWMIService.Get("Win32_Account.SID='"&strsubkey&"'")
Wscript.Echo objAccount.SID
почему в первом случае, который закоментирован, SID объекта выводит, а во втором нет, у того и у другого класса есть свойство SID.

мне нужно выявить имя пользователя ( отображаемое имя) зная его SID, типа Иванов Иван. если я правильно понял такое свойство есть у Win32_Account - Name.

Цель скрипта откорректировать данные в реестре. а именно у всех пользователей
HKEY_USERS\SID\Software\Microsoft\Office\Common\UserInfo отредактировать ключ UserName - поставить актуальный. сейчас у всех пользователей одно и тоже имя - не правильное

Iska 23-05-2012 17:13 1921147

Цитата:

Цитата foxbat
почему в первом случае, который закоментирован, SID объекта выводит, а во втором нет, у того и у другого класса есть свойство SID. »

foxbat, потому что…
читать дальше »
…Вы можете получить конкретный экземпляр объекта, только указав его полный путь. Для этого нужно знать свойства, являющие квалификаторами класса, и их значения, однозначно определяющие конкретный экземпляр объекта среди прочих.

Для класса «Win32_SID» квалификатором является именно свойство «.SID». Потому Вы можете получить экземпляр объекта, указав свойство «.SID»:
Код:

Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx  = objSWbemServicesEx.Get("Win32_SID='S-1-5-21-1004336348-1979792683-839522115-500'")

With objSWbemObjectEx
        WScript.Echo .AccountName, .ReferencedDomainName, .SID
End With

Set objSWbemObjectEx  = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Цитата:

Код:

Администратор S-1-5-21-1004336348-1979792683-839522115-500

Для класса же «Win32_Account» квалификаторами является пара свойств: «.Domain» и «.Name». Соответственно, чтобы получить конкретный экземпляр класса «Win32_Account», Вы обязаны указать оба этих свойства в методе «.Get», например:
Код:

Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set objSWbemObjectEx  = objSWbemServicesEx.Get("Win32_UserAccount.Domain='MachineName',Name='Администратор'")

With objSWbemObjectEx
        WScript.Echo .Name, .Domain, .SID
End With

Set objSWbemObjectEx  = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Вы же пытаетесь получить экземпляр, не указывая квалификаторов объекта. Сие не верно.

Цитата:

Цитата foxbat
мне нужно выявить имя пользователя ( отображаемое имя) зная его SID, »

Вы можете использовать первый пример.

foxbat 23-05-2012 17:34 1921159

Iska, спасибо за разъяснение.

foxbat 24-05-2012 11:20 1921611

Цитата:

Цитата Iska
Вы можете использовать первый пример. »

из него можно взять имя пользователя, ivanov_i , а мне нужно отображаемое имя вида Иванов Иван. Его можно откуда-нибудь взять ?

Iska 24-05-2012 12:06 1921642

Цитата:

Цитата foxbat
из него можно взять имя пользователя, ivanov_i , а мне нужно отображаемое имя вида Иванов Иван. Его можно откуда-нибудь взять ? »

Ясно. Тогда только перечислять объекты класса «Win32_UserAccount», фильтруя по известному SID'у:
Код:

Option Explicit

Dim strComputer
Dim strSID

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."
strSID      = "S-1-5-21-117609710-1715567821-725345543-500"

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_UserAccount WHERE SID = '" & strSID & "'")

For Each objSWbemObjectEx In collSWbemObjectSet
        With objSWbemObjectEx
                WScript.Echo .Name, .Domain, .FullName, .SID
        End With
Next

Set objSWbemObjectEx  = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0



Время: 03:42.

Время: 03:42.
© OSzone.net 2001-