Войти

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


foxbat
23-05-2012, 16:16
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
почему в первом случае, который закоментирован, 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

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

foxbat
23-05-2012, 17:34
Iska, спасибо за разъяснение.

foxbat
24-05-2012, 11:20
Вы можете использовать первый пример. »
из него можно взять имя пользователя, ivanov_i , а мне нужно отображаемое имя вида Иванов Иван. Его можно откуда-нибудь взять ?

Iska
24-05-2012, 12:06
из него можно взять имя пользователя, 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




© OSzone.net 2001-2012