2012-08-31 45 views
3

我想使用C#代码创建Windows用户。当登录用户拥有管理员权限时,以下方法可以正常工作。它不与有限的用户一起工作。请注意,我可以传递管理员用户的Windows用户名和密码。基本上我想模仿。我试图模拟它没有工作。我尝试将用户namd和密码传递给processinfo。我收到错误“存根收到不良数据”。所以,任何人都可以帮助我如何通过模拟使用C#代码创建Windows用户。使用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

@ hugh - 我在process.Start()获取错误。线。 – Saran

+0

@ hugh-没有一个答案帮助了我。我不能简单地接受它吗? – Saran

回答

3

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

您可以设置在ProcessStartInfo类要执行的用户(PasswordSecureString,顺便)一UserNamePassword - 这传递给Process构造,你是好去。

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

... 

Process.Start(startInfo); 
+0

嗨oded,在我的问题中我提到过,我做的和你描述的一样。但是我收到错误“存根收到不良数据”。 – Saran

+0

@Saran - 几乎一样。我正在使用'ProcessStartInfo',你不是。另外,正如Hugh评论的那样,你得到的错误似乎与代码无关。 – Oded

+0

我已经重新发布了使用用户名和密码的方法。它没有奏效。 – Saran

0

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