public static class MachineSidHelper
{
private static SecurityIdentifier GetAccountSid(string localAdminAccount)
{
NTAccount name = new NTAccount(localAdminAccount);
SecurityIdentifier sid = (SecurityIdentifier)name.Translate(typeof(SecurityIdentifier));
return sid;
}
// Get the Machine Sid for the PC the code is currently executing on
public static string MachineSid
{
get
{
string machineSid = string.Empty;
string domain;
short accounttype;
try
{
LookupAccountName(Environment.MachineName,
Environment.MachineName, out machineSid,
out domain, out accounttype);
System.Diagnostics.Debug.WriteLine("From LookupAccountName
(\'" + Environment.MachineName + "\', \'" +
Environment.MachineName + "\', ...): " + machineSid);
}
catch (Exception)
{
System.Diagnostics.Trace.WriteLine(
"Can not get the Machine Identifier using \'LookupAccountName\'");
}
if (machineSid.Length < 1)
{
string account = Environment.MachineName + @"\Administrator";
try
{
SecurityIdentifier sid = GetAccountSid(account);
machineSid = sid.AccountDomainSid.ToString();
System.Diagnostics.Debug.WriteLine("From GetAccountSid(\'" + account +
"\'): " + machineSid);
}
catch (Exception)
{
System.Diagnostics.Trace.WriteLine(
"Can not get the Machine Identifier using \'Administrator Sid\'");
}
}
return machineSid;
}
}
internal static bool LookupAccountName(string strServer,
string strAccountName, out string accountSid,
out string strDomainName, out short AccountType)
{
bool bRet = false;
int lSidSize = 256;
int lDomainNameSize = 256;
accountSid = "";
strDomainName = "";
AccountType = 0;
StringBuilder strName;
lSidSize = 0;
IntPtr Sid = IntPtr.Zero;
// First get the required buffer sizes for SID and domain name.
int nRet = Win32API.LookupAccountName(
strServer,
strAccountName,
Sid,
ref lSidSize,
null,
ref lDomainNameSize,
ref AccountType);
bRet = (0 != nRet);
if (!bRet)
{
int nErr = Marshal.GetLastWin32Error();
if (122 == nErr) // Buffer too small
{
// Allocate the buffers with actual sizes that are required
// for SID and domain name.
strName = new StringBuilder(lDomainNameSize);
Sid = Marshal.AllocHGlobal(lSidSize);
nRet = Win32API.LookupAccountName(
strServer,
strAccountName,
Sid,
ref lSidSize,
strName,
ref lDomainNameSize,
ref AccountType);
bRet = (0 != nRet);
if (bRet)
{
byte[] sidArray = new byte[lSidSize];
strDomainName = strName.ToString();
Marshal.Copy(Sid, sidArray, 0, lSidSize);
SecurityIdentifier sid = new SecurityIdentifier(sidArray, 0);
accountSid = sid.ToString();
}
}
else
{
System.Diagnostics.Debug.WriteLine(nErr);
}
}
Marshal.FreeHGlobal(Sid);
return bRet;
}
private class Win32API
{
#region Win32 API Interfaces
[DllImport("Advapi32.dll", SetLastError = true)]
public static extern int LookupAccountName(
string ServerName,
string AccountName,
IntPtr Sid,
ref int SidSize,
StringBuilder DomainName,
ref int DomainNameSize,
ref short SidUse);
#endregion
}
}
April 13, 2007
Finding a Machine SID in C#
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment