使用c#代码创建Windows用户

时间:2012-08-31 12:11:50

标签: c# visual-studio

我想使用c#代码创建一个Windows用户。当登录用户具有管理员权限时,下面的方法可以正常工作。它不适用于受限用户。请注意,我可以传递管理员用户的Windows用户名和密码。基本上我想模仿。我试过冒充它没用。我尝试将用户namd和密码传递给processinfo。我收到错误“存根收到坏数据”。所以任何人都可以通过模仿来帮助我使用c#代码创建windows用户。

    public static void CreateUser(string userName, string password, string description, string adminUserName, string adminPassword)
    {
        Process process = new Process();
        ProcessStartInfo processInfo = new ProcessStartInfo();
        processInfo.WorkingDirectory = Environment.SystemDirectory;
        processInfo.FileName = "net.exe";
        processInfo.UseShellExecute = false;
        processInfo.RedirectStandardError = true;
        processInfo.RedirectStandardInput = true;
        processInfo.RedirectStandardOutput = true;
        processInfo.WindowStyle = ProcessWindowStyle.Hidden;

        processInfo.Arguments = @" user " + userName + @" " + password + @" /ADD /ACTIVE:YES " +
          @"/EXPIRES:NEVER /FULLNAME:" + userName + @" /PASSWORDCHG:NO /PASSWORDREQ:YES";


        if (!string.IsNullOrEmpty(adminUserName))
        {
            processInfo.UserName = adminUserName;
            processInfo.Password = WindowsSecurityHelper.GetSecuredString(adminPassword);
        }
        process.StartInfo = processInfo;
        process.Start();
        process.WaitForExit();
        process.Close();

    }

    public static void CreateUser(string userName, string password, string description, string userGroup = "Users")
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Machine, null);
        GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, userGroup);
        if (gp != null)
        {
            UserPrincipal u = new UserPrincipal(pc);
            u.SetPassword(password);
            u.Name = userName;
            u.Description = description;
            u.UserCannotChangePassword = true;
            u.PasswordNeverExpires = true;
            u.Save();

            gp.Members.Add(u);
            gp.Save();
        }
    }

2 个答案:

答案 0 :(得分:3)

您可以使用具有不同凭据的Process类 - 而不是直接设置它,使用ProcessStartInfo

您可以在UserName课程中为您要执行的用户设置PasswordProcessStartInfoPasswordSecureString,方式) - 将其传递给Process构造函数,你就可以了。

ProcessStartInfo startInfo = new ProcessStartInfo("net.exe");
startInfo.UserName = Administrator;
startInfo.Password = ...;

...

Process.Start(startInfo);

答案 1 :(得分:0)

我遇到了同样的错误,发现我需要在ProcessStartInfo中指定Domain参数。