2008-10-15 59 views
2

我們有一個應用程序,它通過命令行安裝SQL Server Express,並通過參數SQLACCOUNT =「NT AUTHORITY \ SYSTEM」將服務帳戶指定爲LocalSystem帳戶。使用C#確定本地系統帳戶名稱

這不適用於不同的語言,因爲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#中使用的等效代碼?

回答

7

您可以使用.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到名稱查找 - 爲例如,即使您正在運行的用戶帳戶僅在Guests組中,此代碼也應該可以工作。如果SID解析爲域帳戶,情況會有所不同,但即使這樣,在大多數情況下,只要您登錄到域(並且域控制器在查找時可用),它也應該可以正常工作。 。

+0

謝謝mdb。在有限的特權帳戶下是否會有任何問題運行此代碼? – Carl 2008-10-15 15:00:10

1

這應該和你發佈的內容類似。我不知道如何獲得特定屬性的WMI對象的副手,但是這將幫助您開始使用的語法:

ManagementObject m = new ManagementObject("winmgmts:root\cimv2"); 
m.Get(); 
MessageBox.Show(m["Win32_SID.SID='S-1-5-18'"].ToString()); 
+0

還要感謝你Danny。我總是很感激迴應。 – Carl 2008-10-15 15:30:00

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(); 
} 
3

或者你可以使用:

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

隨着WellKnownSidType你可以看看其他賬戶,NetworkService例如。

相關問題