Как получить имена пользователей и домены всех локально сохраненных пользовательских профилей?

Как получить имена пользователей и домены всех профилей пользователей, хранящихся на компьютере?

Вот скриншот менеджера профилей пользователей, чтобы проиллюстрировать, что я имею в виду:

Профили пользователей

1 ответ

Решение

Профили отображаются по SID. Отображение хранится в этом разделе реестра:

[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList]

Вы можете использовать WMI для перечисления идентификаторов безопасности и преобразования их в имя пользователя и имя домена:

Const HKLM = &h80000002
Const profiles = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"

Set wmi = GetObject("winmgmts://./root/cimv2")
Set reg = GetObject("winmgmts://./root/default:StdRegProv")

reg.EnumKey HKLM, profiles, subkeys
For Each sid In subkeys
  Set acct = wmi.Get("Win32_SID.SID='" & sid & "'")
  WScript.Echo acct.ReferencedDomainName & "\" & acct.AccountName
Next

Если вы ищете пользователя / домен только для существующих папок профиля, проверьте, ProfileImagePath значение внутри подразделов указывает на существующую папку:

Const HKLM = &h80000002
Const profiles = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"

Set sh  = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set wmi = GetObject("winmgmts://./root/cimv2")
Set reg = GetObject("winmgmts://./root/default:StdRegProv")

reg.EnumKey HKLM, profiles, subkeys
For Each sid In subkeys
  reg.GetStringValue HKLM, profiles & "\" & sid, "ProfileImagePath", path
  path = sh.ExpandEnvironmentStrings(path)
  If fso.FolderExists(path) Then
    Set acct = wmi.Get("Win32_SID.SID='" & sid & "'")
    WScript.Echo acct.ReferencedDomainName & "\" & acct.AccountName
  End If
Next
Другие вопросы по тегам