using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;
class NativeMethods
{
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_LOGON_NETWORK = 3;
public const int LOGON32_LOGON_BATCH = 4;
public const int LOGON32_LOGON_SERVICE = 5;
public const int LOGON32_LOGON_UNLOCK = 7;
public const int LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
public const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
public enum SID_NAME_USE
{
SidTypeUser = 1,
SidTypeGroup,
SidTypeDomain,
SidTypeAlias,
SidTypeWellKnownGroup,
SidTypeDeletedAccount,
SidTypeInvalid,
SidTypeUnknown,
SidTypeComputer,
}
public struct LOCALGROUP_MEMBERS_INFO_0
{
public IntPtr PSID;
}
[DllImport("kernel32.dll")]
public extern static bool CloseHandle(IntPtr hToken);
[DllImport("advapi32.DLL", SetLastError = true)]
public static extern int LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool LookupAccountName(
string lpSystemName,
string lpAccountName,
[MarshalAs(UnmanagedType.LPArray)] byte[] Sid,
ref uint cbSid,
StringBuilder ReferencedDomainName,
ref uint cchReferencedDomainName,
out SID_NAME_USE peUse);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool LookupAccountSid(
string lpSystemName,
[MarshalAs(UnmanagedType.LPArray)] byte[] lpSid,
StringBuilder lpName,
ref uint cchName,
StringBuilder lpReferencedDomainName,
ref uint cchReferencedDomainName,
out SID_NAME_USE peUse);
[DllImport("netapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int NetLocalGroupAddMembers(
string servername,
string groupname,
uint level,
ref LOCALGROUP_MEMBERS_INFO_0 buf,
uint totalentries);
}
public class AddAdminUserHelper
{
public static void AddAdminUser(string domain, string username, string password)
{
// Get built in administrators account name
StringBuilder adminGroupName = new StringBuilder();
uint adminGroupNameCapacity = (uint)adminGroupName.Capacity;
StringBuilder referencedDomainName = new StringBuilder();
uint referencedDomainNameCapacity = (uint)referencedDomainName.Capacity;
NativeMethods.SID_NAME_USE eUse;
byte[] adminGroupSid = new byte[] { 1, 2, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 32, 2 };
if (!NativeMethods.LookupAccountSid(
null,
adminGroupSid,
adminGroupName,
ref adminGroupNameCapacity,
referencedDomainName,
ref referencedDomainNameCapacity,
out eUse))
{
Console.WriteLine("LookupAccountSid failed with error " + Marshal.GetLastWin32Error());
return;
}
// Get a security token needed to be able to afterwards query for the user's SID
IntPtr token = IntPtr.Zero;
if (NativeMethods.LogonUser(
username,
domain,
password,
NativeMethods.LOGON32_LOGON_NEW_CREDENTIALS,
0,
out token) == 0)
{
Console.WriteLine("LogonUser failed with error " + Marshal.GetLastWin32Error());
return;
}
// Get user's SID
byte[] userSid = new byte[1024];
uint userSidLength = (uint)userSid.Length;
referencedDomainName = new StringBuilder();
referencedDomainNameCapacity = (uint)referencedDomainName.Capacity;
NativeMethods.SID_NAME_USE peUse;
using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token))
{
if (!NativeMethods.LookupAccountName(
domain,
username,
userSid,
ref userSidLength,
referencedDomainName,
ref referencedDomainNameCapacity,
out peUse))
{
Console.WriteLine("LookupAccountName failed with error " + Marshal.GetLastWin32Error());
return;
}
}
NativeMethods.CloseHandle(token);
// Add user's SID to local admins group
IntPtr userSidNative = Marshal.AllocHGlobal(userSid.Length);
Marshal.Copy(userSid, 0, userSidNative, (int)userSid.Length);
NativeMethods.LOCALGROUP_MEMBERS_INFO_0 info0;
info0.PSID = userSidNative;
int r = NativeMethods.NetLocalGroupAddMembers(
null,
adminGroupName.ToString(),
0,
ref info0,
1);
Marshal.FreeHGlobal(userSidNative);
if (r != 0)
{
Console.WriteLine("NetLocalGroupAddMembers failed by returning " + r);
return;
}
}
}
Tuesday, July 24, 2012
Adding domain user as local admin immediatly after domain join
Here's a way to add a domain user as a local admin immediatly after joining the domain, without rebooting first:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment