2012-04-30 22 views
6

Estoy tratando de crear un programa que nos facilite la implementación de nuevas computadoras en el dominio. Lo que quiero que haga, es simplemente cambiar el nombre de la computadora y unirla a nuestro dominio (va a hacer muchas otras cosas, pero esto no llegará hasta que lo haga funcionar).Cambiar el nombre de la computadora y unir el dominio con un reinicio en C#

Código aquí: http://pastebin.com/ayREYH0C

Robados de http://www.experts-exchange.com/Programming/Languages/.NET/Q_26262588.html y luego cambiado para adaptarse a mis necesidades

Mi problema es que la combinación de dominio no respeta el cambio de nombre del equipo. He puesto un Thread.Sleep entre el rename y el join, así que tuve algo de tiempo para comprobar si el cambio de nombre ocurre, ¡y lo hace! Cuando se produce el enlace de dominio, sin embargo, vuelve al antiguo nombre y ese es el nombre de computadora que se crea en el dominio, no el nuevo nombre.

He buscado por todos lados, pero no he encontrado un problema como este, ni una solución para esta necesidad en particular.

+0

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

+0

también esto puede ser de utilidad: http://stackoverflow.com/questions/ 4183759/programma tically-join-windows-machine-to-ad-domain – gordatron

+0

Así que la respuesta es: Únete al dominio, ENTONCES cambia el nombre de la PC. Esto presenta un pequeño problema, ya que los no administradores no tienen permisos para cambiar un nombre de computadora, pero voy a trabajar en eso, gracias por la ayuda :) –

Respuesta

2

Aquí es AC# función que se une a una estación de trabajo a un dominio ... pensé que podría utilizar como un método alternativo que evite WMI y utiliza ManagementObject lugar:

(I se dan cuenta de que las credenciales de ejecución aún necesitará los derechos para cambiar el nombre)

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; 
     } 

    } 
Cuestiones relacionadas