将本地用户添加到本地管理员组

niz*_*ram 10 .net c# user-accounts

我正在编写一个C#程序,用于推出我工作的实验室.该程序是创建一个本地管理员帐户(itadmin),设置密码,设置密码永不过期,并将该帐户添加到本地Administrators组.该程序创建新用户帐户并正确设置所有内容,但当它尝试将其添加到管理组时,我得到一个非常不明显的例外.首先,我是否正确添加组?我错过了什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;

namespace CreateITAdmin
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string userName = "itadmin";
                string userPassword = "password";

                Console.WriteLine("Building System Information");
                DirectoryEntry localMachine = new DirectoryEntry("WinNT://.,computer");
                DirectoryEntry newUser = localMachine.Children.Add(userName, "user");
                DirectoryEntry admGroup = new DirectoryEntry("WinNT://./Administrators,group");

                Console.WriteLine("Building User Information");
                newUser.Properties["FullName"].Value = "IT Administrative User";
                newUser.Invoke("Put", new object[] { "UserFlags", 0x10000 });

                Console.WriteLine("Setting User Password");
                newUser.Invoke("SetPassword", new object[] { userPassword });

                newUser.CommitChanges();

                Console.WriteLine("Adding itadmin to Administrators Group");
                admGroup.Invoke("Add", "WinNT://./" + newUser);

                Console.WriteLine("Cleaning Up");
                localMachine.Close();
                newUser.Close();
                admGroup.Close();
            }
            catch (System.DirectoryServices.DirectoryServicesCOMException E)
            {
                Console.WriteLine(E.Message.ToString());
                Console.ReadLine();
            }
            catch (System.Runtime.InteropServices.COMException E)
            {
                Console.WriteLine(E.Message.ToString());
                Console.ReadLine();
            }
            catch (System.Reflection.TargetInvocationException E)
            {
                Console.WriteLine(E.Message.ToString());
                Console.ReadLine();
            }
            catch (Exception E)
            {
                Console.WriteLine(E.Message.ToString());
                Console.ReadLine();
            }

            Console.WriteLine();
            Console.WriteLine("Press Any Key to Continue");
            Console.ReadLine();
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码输出如下:

Building System Information
Building User Information
Setting User Password
Adding itadmin to Administrators Group
Exception has been thrown by the target of an invocation.
Run Code Online (Sandbox Code Playgroud)

任何见解都会受到极大的关注.

更新1: 在@ Grumbler85的帮助下,下面列出了例外情况:

System.Reflection.TargetInvocationException: Exception has been thrown by the target 
of an invocation. ---> System.Runtime.InteropServices.COMException: A member could not
be added to or removed from the local group because the member does not exist. --- End
of inner exception stacktrace --- at System.DirectoryServices.DirectoryEntry.Invoke
(String methodName,Object[]args) at CreateITAdmin.Program.Main(String[]args)in 
H:\code\CS\CreateITAdmin\CreateITAdmin\Program.cs:line 37
Run Code Online (Sandbox Code Playgroud)

在@ Grumbler85的帮助下,我一直在努力将库使用更新到System.DirectoryServices.AccountManagement.它看起来更简单,使用起来更直接.随着我的进步,会有更多更新/细节.

更新2: 我知道这是一个快速跟进,但我能够完成对新命名空间的更新.在定义机器的轻微打击之后,我能够成功创建用户,设置密码,更新密码以永不过期,并将用户添加到管理员组.感谢@ Grumbler85对新命名空间的更新.新代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;

namespace CreateITAdmin
{
    class Program
    {
        static void Main(string[] args)
        {
            string userName = "itadmin";
            string userPassword = "IT-Engineering1";
            PrincipalContext systemContext = null;

            try
            {
                Console.WriteLine("Building System Information");
                systemContext = new PrincipalContext(ContextType.Machine, null);
            }
            catch (Exception E)
            {
                Console.WriteLine("Failed to create System Context.");
                Console.WriteLine("Exception: " + E);

                Console.WriteLine();
                Console.WriteLine("Press Any Key to Continue");
                Console.ReadLine();
                return;
            }

            //Check if user object already exists
            Console.WriteLine("Checking if User Exists.");
            UserPrincipal usr = UserPrincipal.FindByIdentity(systemContext, userName);
            if (usr != null)
            {
                Console.WriteLine(userName + " already exists. Exiting!!");
                Console.ReadLine();
                return;
            }

            //Create the new UserPrincipal object
            Console.WriteLine("Building User Information");
            UserPrincipal userPrincipal = new UserPrincipal(systemContext);
            userPrincipal.Name = userName;
            userPrincipal.DisplayName = "IT Administrative User";
            userPrincipal.PasswordNeverExpires = true;
            userPrincipal.SetPassword(userPassword);
            userPrincipal.Enabled = true;

            try
            {
                Console.WriteLine("Creating New User");
                userPrincipal.Save();
            }
            catch (Exception E)
            {
                Console.WriteLine("Failed to create user.");
                Console.WriteLine("Exception: " + E);

                Console.WriteLine();
                Console.WriteLine("Press Any Key to Continue");
                Console.ReadLine();
                return;
            }

            GroupPrincipal groupPrincipal = null;
            try
            {
                groupPrincipal = GroupPrincipal.FindByIdentity(systemContext, "Administrators");

                if (groupPrincipal != null)
                {
                    //check if user is a member
                    Console.WriteLine("Checking if itadmin is part of Administrators Group");
                    if (groupPrincipal.Members.Contains(systemContext, IdentityType.SamAccountName, userName))
                    {
                        Console.WriteLine("Administrators already contains " + userName);
                        return;
                    }
                    //Adding the user to the group
                    Console.WriteLine("Adding itadmin to Administrators Group");
                    groupPrincipal.Members.Add(userPrincipal);
                    groupPrincipal.Save();
                    return;
                }
                else
                {
                    Console.WriteLine("Could not find the group Administrators");
                }
            }
            catch (Exception E)
            {
                Console.WriteLine("Exception adding user to group.");
                Console.WriteLine("Exception: " + E);

                Console.WriteLine();
                Console.WriteLine("Press Any Key to Continue");
                Console.ReadLine();
            }

            Console.WriteLine("Cleaning Up");
            groupPrincipal.Dispose();
            userPrincipal.Dispose();
            systemContext.Dispose();

            Console.WriteLine();
            Console.WriteLine("Press Any Key to Continue");
            Console.ReadLine();
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sco*_*ain -8

您提到这些计算机位于域中,使用组策略执行此操作要简单得多。

进入组策略管理 ( gpmc.msc) 并创建一个新策略。创建新策略后,请转至Computer Configuration->Prefrences->Local Users and Groups在此输入图像描述

从那里右键单击并转到New->Local User。在新屏幕中将操作设置为Create(您可以单击帮助按钮以查看模式之间的差异)并在该屏幕中输入用户的信息。

在此输入图像描述

单击“确定”后,用户将显示在本地用户和组页面的屏幕上。从那里右键单击并转到New->Local Group。在新页面上将操作设置为Update,使用下拉列表找到组名称Administrators (built-in)并选择它。在底部单击Add...并手动输入您在上一屏幕中输入的相同名称(itadmin在您的情况下)。最后它应该看起来像这样

在此输入图像描述

本地用户和组页面将如下所示

在此输入图像描述

需要注意的是Order栏,管理员组的更新必须有比用户创建命令更高的order号。

如果您设置了组策略,则将该策略应用于实验室中的计算机(无论是通过 OU 定位、安全过滤还是 WMI 过滤)。下次重新启动时,将在每台计算机上创建本地 itadmin 用户。


还有一个有趣的注意事项,当您在选择要添加到本地管理员组的用户时选择用户时,您可以单击并选择域上的...用户,这将允许某人使用其域登录名成为小型集合中的本地管理员的计算机,却没有赋予它们成为各地管理员的权利。但是,他们需要能够使用域登录才能正常工作,因此,如果您正在排除网络连接问题,则当前的方法可能是更好的选择。

  • 我否决了这个,因为你没有回答这个问题。您给出了另一种选择...但问题是如何以编程方式完成此任务。我理解提供一个程序化的替代方案......但在我看来这是大错特错的。 (7认同)
  • 但这不是一个旧鞋或玻璃瓶问题。创建一个程序来创建用户是自动化此类任务的完全有效的方法。我很惊讶你会尝试引导他手动重复解决方案。我猜OP已经知道如何mmc了。 (2认同)