2008-12-19 6 views

Trả lời

9

Chức năng API Win32 LookupAccountSid() được sử dụng để tìm tên tương ứng với SID.

LookupAccountSid() có chữ ký sau đây:

BOOL LookupAccountSid(LPCTSTR lpSystemName, PSID Sid,LPTSTR Name, LPDWORD cbName, 
         LPTSTR ReferencedDomainName, LPDWORD cbReferencedDomainName, 
         PSID_NAME_USE peUse); 

MSDN Ref.

Đây là P/Invoke tài liệu tham khảo (với mẫu mã): http://www.pinvoke.net/default.aspx/advapi32.LookupAccountSid

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError = true)] 
static extern bool LookupAccountSid (
    string lpSystemName, 
    [MarshalAs(UnmanagedType.LPArray)] byte[] Sid, 
    StringBuilder lpName, 
    ref uint cchName, 
    StringBuilder ReferencedDomainName, 
    ref uint cchReferencedDomainName, 
    out SID_NAME_USE peUse); 
+0

Có cách nào khác để làm điều đó mà không sử dụng p/gọi trong C#? –

+0

@DennisC bạn có thể làm điều đó mà không cần P/Gọi. Xin vui lòng xem câu trả lời của tôi: http://stackoverflow.com/questions/7593005/convert-sid-to-username-in-c-sharp/7593200 –

+0

@EriawanKusumawardhono Tôi đoán bạn có thể không đọc các câu hỏi rất tốt. Vì chúng hoàn toàn trái ngược với API –

26

Chỉ cần tìm thấy nó trên pinvoke.net.

Alternative API quản lý: Có sẵn trong Net 2.0:

using System.Security.Principal; 

// convert the user sid to a domain\name 
string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount)).ToString(); 
+0

Giải pháp này không đáng tin cậy trong mọi tình huống. Đôi khi có SID không thể dịch được và điều này sẽ ném một ngoại lệ. Tôi đã tìm thấy LookupAccountSid() để đáng tin cậy hơn. –