Как сопоставить подключи HKEY_USERS и имена пользователей Windows? - PullRequest
5 голосов
/ 23 июня 2009

Я думал, что имена ключей сразу под HKEY_USERS должны были быть именами пользователей, которые когда-либо входили в систему на этом компьютере. Но в моей машине, что появляется:

S-1-5-18
S-1-5-19
S-1-5-20
S-1-5-21-NNNNNNNNN-NNNNNNNNN-NNNNNNNNNN-NNNNN
S-1-5-21-NNNNNNNNN-NNNNNNNNN-NNNNNNNNNN-NNNNN_Classes

Я бы хотел определить, какое поддерево соответствует какому пользователю. Как я могу это сделать?

Edit: что мне нужно, чтобы получить имена пользователей из SID. Я хочу проверить конфигурации каждого пользователя, который когда-либо входил в систему, и мне нужно знать их имена. Например, в приведенном выше реестре мне нужно иметь возможность, основываясь на строке "S-1-5-21-NNNNNNNNN-NNNNNNNNN-NNNNNNNNNN-NNNNN", определить, что оно соответствует DOMAIN \ somebody или LOCALMACHINENAME \ somebodyelse.

Ответы [ 7 ]

9 голосов
/ 09 июня 2011

Можно запросить эту информацию из WMI . Следующая команда выведет таблицу со строкой для каждого пользователя вместе с SID для каждого пользователя.

wmic useraccount get name,sid

Вы также можете экспортировать эту информацию в CSV:

wmic useraccount get name,sid /format:csv > output.csv

Я использовал это на Vista и 7 (согласно комментариям, это работает и на 2008 R2). Для получения дополнительной информации см. WMIC - Управление командной строкой через WMI .

2 голосов
/ 07 августа 2013

Для PowerShell это быстро:

gwmi win32_userprofile | ft localpath, sid

Эшли МакГлон Microsoft PFE http://aka.ms/GoateePFE

2 голосов
/ 23 июня 2009

Я считаю, что эти цифры являются идентификатором безопасности пользователя (SID). Вы можете использовать SysInternals для получения идентификаторов безопасности пользователей:

http://technet.microsoft.com/en-us/sysinternals/bb897417.aspx

1 голос
/ 23 июня 2009

HKLM \ System \ CurrentControlSet \ Control \ hivelist покажет вам, откуда монтируются ульи. Хотя это и не прямое сопоставление, обычно точка монтирования содержит имя пользователя в пути.

Я уверен, что есть лучший ответ, чем этот, хотя ...

0 голосов
/ 07 октября 2013

Пожалуйста, используйте powershell :

$mydocuments = [Environment]::GetFolderPath("mydocuments")
gwmi win32_userprofile | ft localpath, sid, status -AutoSize | Out-File $mydocuments\userprofiles.txt
0 голосов
/ 23 июня 2009

в C # есть ответ на перевод имени пользователя в SID здесь http://community.bartdesmet.net/blogs/bart/archive/2006/09/08/4394.aspx, но это только для локальных ПК.

Для нашей эры я преобразовал это в:

using System;
using System.DirectoryServices;
using System.Security.Principal;

class Program {
    static void Main(string[] args) {
        string path = "LDAP://" + args[0];
        DirectoryEntry root = new DirectoryEntry(path, args[1], null, AuthenticationTypes.Secure);
        string sid = new SecurityIdentifier((byte[])root.Properties["objectSID"][0], 0).Value;
        Console.WriteLine(sid);
    }
}

Использование: programname.exe DOMAIN имя пользователя

например. имя_программы.exe somecompany.com preet_sangha

0 голосов
/ 23 июня 2009

Когда вы делаете это вручную (без дополнительных инструментов), самый простой способ - открыть разрешения для этого ключа. Единственный пользователь, который имеет полные права, является владельцем ключа.

Когда из программы вам потребуется способ конвертации SID в имена учетных записей. В C # (или PowerShell) взгляните на классы SecurityIdentifier и NtAccount для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...