2

コマンド ラインから SQL Server Express をインストールし、パラメーター SQLACCOUNT="NT AUTHORITY\SYSTEM" を介してサービス アカウントを LocalSystem アカウントとして指定するアプリケーションがあります。

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

4 に答える 4

9

この目的のために、.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 がドメイン アカウントに解決される場合は少し状況が異なりますが、ドメインにログオンしている限り (および検索時にドメイン コントローラーが利用可能である限り)、ほとんどの場合は正常に機能するはずです。 .

于 2008-10-15T14:49:27.203 に答える
3

または、次を使用できます。

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

WellKnownSidTypeたとえば、他のアカウントを探すことができますNetworkService

于 2013-04-10T12:59:46.293 に答える
1

受け入れられた回答の問題は、アカウント名がコードを実行しているローカルマシンによって解決可能でなければならないことです。

リモートマシンで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();
}
于 2009-07-21T14:29:58.797 に答える
1

これは、投稿したものと同様のことを行う必要があります。WMI オブジェクトの特定のプロパティをすぐに取得する方法はわかりませんが、次の構文から始めることができます。

ManagementObject m = new ManagementObject("winmgmts:root\cimv2");
m.Get();
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString());
于 2008-10-15T14:34:37.840 に答える