Определите имя учетной записи LocalSystem с помощью C # - PullRequest
2 голосов
/ 15 октября 2008

У нас есть приложение, которое устанавливает SQL Server Express из командной строки и указывает учетную запись службы в качестве учетной записи LocalSystem через параметр SQLACCOUNT = "NT AUTHORITY \ SYSTEM".

Это не работает с разными языками, потому что имя учетной записи для LocalSystem отличается. Здесь есть таблица с перечислением различий:

http://forums.microsoft.com/MSR/ShowPost.aspx?PostID=685354&SiteID=37

Похоже, это не завершено (шведская версия не указана). Поэтому я хотел бы иметь возможность определять имя программно, возможно, используя SID?

Я нашел скрипт VB для этого:

Set objWMI = GetObject("winmgmts:root\cimv2") 

Set objSid = objWMI.Get("Win32_SID.SID='S-1-5-18'") 

MsgBox objSid.ReferencedDomainName & "\" & objSid.AccountName 

Кто-нибудь знает эквивалентный код, который можно использовать в C #?

Ответы [ 4 ]

7 голосов
/ 15 октября 2008

Вы можете использовать встроенный в .NET System.Security.Principal.SecurityIdentifier класс для этой цели: преобразовав его в экземпляр NtAccount , вы можете получить имя учетной записи:

using System.Security.Principal;


SecurityIdentifier sid = new SecurityIdentifier("S-1-5-18");
NTAccount acct = (NTAccount)sid.Translate(typeof(NTAccount));
Console.WriteLine(acct.Value);

Позже отредактируйте, отвечая на вопрос в комментариях: вам не нужны никакие специальные привилегии для поиска SID по имени на локальном компьютере - например, даже если учетная запись, под которой вы работаете, находится только в В группе Гости этот код должен работать. Ситуация немного отличается, если SID разрешается с учетной записью домена, но даже это должно работать правильно в большинстве случаев, если вы вошли в домен (и контроллер домена доступен во время поиска) .

3 голосов
/ 10 апреля 2013

Или вы можете использовать:

string localSystem = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null).Translate(typeof(NTAccount)).Value;

С помощью WellKnownSidType вы можете искать другие учетные записи, например NetworkService.

1 голос
/ 21 июля 2009

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

Если вы читаете ACL на удаленном компьютере, вы, вероятно, не сможете разрешить доменные SID / локальные SID на удаленном компьютере. Следующее использует WMI и принимает параметр удаленного компьютера и SID, который вы хотите разрешить удаленному компьютеру.

/// <summary>
/// Returns the Account name for the specified SID 
// using WMI against the specified remote machine
/// </summary>
private string RemoteSID2AccountName(String MachineName, String SIDString)
{
    ManagementScope oScope = new ManagementScope(@"\\" + MachineName +     
       @"\root\cimv2");
    ManagementPath oPath = new ManagementPath("Win32_SID.SID='" + SIDString + "'");
    ManagementObject oObject = new ManagementObject(oScope, oPath, null);
    return oObject["AccountName"].ToString();
}
1 голос
/ 15 октября 2008

Это должно сделать что-то похожее на то, что вы опубликовали. Я не уверен, как получить определенные свойства объектов WMI, но это поможет вам начать с синтаксиса:

ManagementObject m = new ManagementObject("winmgmts:root\cimv2");
m.Get();
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...