2012-04-30 3 views
6

Я пытаюсь создать программу, которая облегчит нам развертывание новых компьютеров в домене. Что я хочу сделать, просто переименуйте компьютер и присоедините его к нашему домену (это будет делать много других вещей, но это не произойдет, пока у меня это не получится).Переименуйте компьютер и присоедините домен с одной перезагрузкой в ​​C#

код здесь: http://pastebin.com/ayREYH0C

Похищенные из http://www.experts-exchange.com/Programming/Languages/.NET/Q_26262588.html, а затем изменен, чтобы соответствовать моим потребностям

Моя проблема в том, что присоединение к домену не уважает переименование компьютера. Я включил Thread.Sleep между переименованием и соединением, поэтому у меня было время проверить, действительно ли переименование происходит, и это так! Когда domainjoin происходит, он возвращается к старому имени, хотя и это имя пользователя, которое создается в домене, а не новое имя.

Я искал все вокруг, но не нашел проблему, подобную этой, или решение для этой конкретной потребности.

+0

вы видели: http://stackoverflow.com/questions/6217799/rename-computer-and-join-to-domain-in-one-step-with-powershell и http://social.technet.microsoft.com/Forums/en-US/ITCG/thread/ad11d4c0-20cd-406b-94a4-9551cdc73388/ – gordatron

+0

также может быть полезно: http://stackoverflow.com/questions/ 4183759/Programma tically-join-windows-machine-to-ad-domain – gordatron

+0

Итак, ответ: Присоединитесь к домену, затем измените имя ПК. Это представляет собой небольшую проблему, поскольку у non-admins нет разрешений на изменение имени пользователя, но я обойдусь этим, спасибо за помощь :) –

ответ

2

Вот переменный ток # функция, которая присоединяется к рабочей станции к домену ... мысль вы могли бы найти применение его в качестве альтернативного метода, который позволяет избежать WMI и использует ManagementObject вместо:

(Я понимаю, что исполняющие полномочия еще нужны права переименовать)

public static bool Join(string dom,string usr, string pass) 
    { 
     // Define constants used in the method. 
     int JOIN_DOMAIN = 1; 
     int ACCT_CREATE = 2; 
     int ACCT_DELETE = 4; 
     int WIN9X_UPGRADE = 16; 
     int DOMAIN_JOIN_IF_JOINED = 32; 
     int JOIN_UNSECURE = 64; 
     int MACHINE_PASSWORD_PASSED = 128; 
     int DEFERRED_SPN_SET = 256; 
     int INSTALL_INVOCATION = 262144; 

     // Define parameters that we will use later when we invoke the method. 
     // Remember, the username must have permission to join the object in the AD. 
     //string domain = "domain"; 
     //string password = "password"; 
     //string username = "username"; 
     //string destinationOU = "destinationOU"; 

     // Here we will set the parameters that we like using the logical OR operator. 
     // If you want to create the account if it doesn't exist you should add " | ACCT_CREATE " 
     // For more information see: http://msdn.microsoft.com/en-us/library/aa392154%28VS.85%29.aspx 
     int parameters = JOIN_DOMAIN | DOMAIN_JOIN_IF_JOINED; 

     // The arguments are passed as an array of string objects in a specific order 
     object[] methodArgs = { dom, pass, usr + "@" + dom, null, parameters }; 

     // Here we construct the ManagementObject and set Options 
     ManagementObject computerSystem = new ManagementObject("Win32_ComputerSystem.Name='" + Environment.MachineName + "'"); 
     computerSystem.Scope.Options.Authentication = System.Management.AuthenticationLevel.PacketPrivacy; 
     computerSystem.Scope.Options.Impersonation = ImpersonationLevel.Impersonate; 
     computerSystem.Scope.Options.EnablePrivileges = true; 

     // Here we invoke the method JoinDomainOrWorkgroup passing the parameters as the second parameter 
     object Oresult = computerSystem.InvokeMethod("JoinDomainOrWorkgroup", methodArgs); 

     // The result is returned as an object of type int, so we need to cast. 
     int result = (int)Convert.ToInt32(Oresult); 

     // If the result is 0 then the computer is joined. 
     if (result == 0) 
     { 
      MessageBox.Show("Joined Successfully!"); 
      return true; 
     } 
     else 
     { 
      // Here are the list of possible errors 
      string strErrorDescription = " "; 
      switch (result) 
      { 
       case 5: strErrorDescription = "Access is denied"; 
        break; 
       case 87: strErrorDescription = "The parameter is incorrect"; 
        break; 
       case 110: strErrorDescription = "The system cannot open the specified object"; 
        break; 
       case 1323: strErrorDescription = "Unable to update the password"; 
        break; 
       case 1326: strErrorDescription = "Logon failure: unknown username or bad password"; 
        break; 
       case 1355: strErrorDescription = "The specified domain either does not exist or could not be contacted"; 
        break; 
       case 2224: strErrorDescription = "The account already exists"; 
        break; 
       case 2691: strErrorDescription = "The machine is already joined to the domain"; 
        break; 
       case 2692: strErrorDescription = "The machine is not currently joined to a domain"; 
        break; 
      } 
      MessageBox.Show(strErrorDescription.ToString()); 
      return false; 
     } 

    } 
Смежные вопросы