- 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