Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>The podcast tells me I should ask, and answer, questions when they're not answered on SO already. Here goes.</p> <p>The easy way, with .NET 2.0 and up, is this:</p> <pre><code>NTAccount f = new NTAccount("username"); SecurityIdentifier s = (SecurityIdentifier) f.Translate(typeof(SecurityIdentifier)); String sidString = s.ToString(); </code></pre> <p>The hard way, which works when that won't, and works on .NET 1.1 also:</p> <pre><code>[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] public static extern bool LookupAccountName([In,MarshalAs(UnmanagedType.LPTStr)] string systemName, [In,MarshalAs(UnmanagedType.LPTStr)] string accountName, IntPtr sid, ref int cbSid, StringBuilder referencedDomainName, ref int cbReferencedDomainName, out int use); [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)] internal static extern bool ConvertSidToStringSid(IntPtr sid, [In,Out,MarshalAs(UnmanagedType.LPTStr)] ref string pStringSid); /// &lt;summary&gt;The method converts object name (user, group) into SID string.&lt;/summary&gt; /// &lt;param name="name"&gt;Object name in form domain\object_name.&lt;/param&gt; /// &lt;returns&gt;SID string.&lt;/returns&gt; public static string GetSid(string name) { IntPtr _sid = IntPtr.Zero; //pointer to binary form of SID string. int _sidLength = 0; //size of SID buffer. int _domainLength = 0; //size of domain name buffer. int _use; //type of object. StringBuilder _domain = new StringBuilder(); //stringBuilder for domain name. int _error = 0; string _sidString = ""; //first call of the function only returns the sizes of buffers (SDI, domain name) LookupAccountName(null, name, _sid, ref _sidLength, _domain, ref _domainLength, out _use); _error = Marshal.GetLastWin32Error(); if (_error != 122) //error 122 (The data area passed to a system call is too small) - normal behaviour. { throw (new Exception(new Win32Exception(_error).Message)); } else { _domain = new StringBuilder(_domainLength); //allocates memory for domain name _sid = Marshal.AllocHGlobal(_sidLength); //allocates memory for SID bool _rc = LookupAccountName(null, name, _sid, ref _sidLength, _domain, ref _domainLength, out _use); if (_rc == false) { _error = Marshal.GetLastWin32Error(); Marshal.FreeHGlobal(_sid); throw (new Exception(new Win32Exception(_error).Message)); } else { // converts binary SID into string _rc = ConvertSidToStringSid(_sid, ref _sidString); if (_rc == false) { _error = Marshal.GetLastWin32Error(); Marshal.FreeHGlobal(_sid); throw (new Exception(new Win32Exception(_error).Message)); } else { Marshal.FreeHGlobal(_sid); return _sidString; } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload