2010-02-15 20 views
5

Le pido que lea mi pregunta detenidamente.Cambiar la configuración de SQL Server programáticamente

Es posible que sepa al instalar VS2005/2008 con la edición SQL Server Express, el SQL Server funciona en modo de autenticación de Windows de forma predeterminada. Puede usar SQL Server Management Studio para cambiar el modo a modo mixto (modo de Autenticación de Windows y SQL Server).

De manera similar para permitir la conexión remota de SQL Server a través de TCP/IP, necesita usar el Administrador de configuración de SQL Server, luego seleccione Protocolo para SQLEXPRESS y luego cambie la configuración para la opción Tcp/IP.

Lo que necesito es automatizar este proceso programáticamente usando C#. Es decir, necesito escribir un programa C# para cambiar el modo o cambiar la configuración tcp/ip, etc.

¿Alguien me puede ayudar con esto? ¿Cómo puedo hacerlo?

Gracias por compartir su valioso tiempo.

Respuesta

9

Debe usar Objetos de administración de SQL Server (SMO): esta es una API para administrar SQL Server mediante programación.

ACTUALIZACIÓN:

resulta ser un poco complicado: Server.LoginMode (lectura/escritura), y Server.TcpEnabled Server.NamedPipesEnabled (obtener sólo, por desgracia). Con el fin de modificar los protocolos, es necesario examinar Microsoft.SqlServer.Management.Smo.Wmi espacio de nombres (de ahí que va desde 'el otro extremo'):

  • ServerProtocol - representa protocolo de servidor
  • ServerProtocolCollection - una colección de todos los protocolos definidos en un servidor determinado
+0

Gracias Alex por su pronta respuesta. – IrfanRaza

+0

Iba a sugerir esto pero no he encontrado dónde en SMO puede cambiar los protocolos de conexión. Pero, es el lugar más probable para encontrarlos. – Will

+0

Gracias Will, intentaré profundizar más en SMO. – IrfanRaza

2

creo que se podría resolver su problema para hacer una instalación silenciosa de edición de SQL Server Express utilizando un archivo de configuración para el proceso de instalación.

En el enlace this puede encontrar los parámetros de línea de comandos para la instalación.

En this one puede encontrar cómo crear su archivo de configuración.

+0

Gracias Jonathan, pero no quiero eso. Porque necesito cambiar la configuración para el producto ya instalado. – IrfanRaza

+0

¡Oh! Ok: D. ¡Buena suerte! La respuesta AlexS parece un buen punto de partida. – Jonathan

4

¿Qué hay de modificar el registro?

los ajustes del protocolo de cliente se almacenan aquí: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Client \ SNI9.0 Confirmar ProtocolOrder.

modo de autenticación se almacena aquí: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ MSSQLServer \ LoginMode

Ver: Authentication Settings

+0

Gracias amigo! Parece otra cosa agradable. – IrfanRaza

5

Esta función en C# permitirá Protocolo TCP/IP y establecer el modo de inicio de sesión en modo mixto.

Ver información complementaria here.

Aquí está el código:

private static bool SetServerProperties() 
    { 
     #region standardize Connection String 
     string tempCatalog = "master"; 
     string temp = @"Data Source=" + dataSource + ";Initial Catalog=" + tempCatalog + ";Integrated Security=True;MultipleActiveResultSets=True"; 
     #endregion 

     SqlConnection sqlconnection = new SqlConnection(temp); 
     SqlCommand cmd = new SqlCommand("select @@ServerName", sqlconnection); 
     sqlconnection.Open(); 
     string serverName = ""; 
     try 
     { 
      SqlDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
       serverName = dr[0].ToString(); 
     } 
     catch 
     { 
      MessageBox.Show("Failed to Set SQL Server Properties for remote connections."); 
     } 

     Server srv = new Server(serverName); 
     srv.ConnectionContext.Connect(); 
     srv.Settings.LoginMode = ServerLoginMode.Mixed; 

     ManagedComputer mc = new ManagedComputer(); 

     try 
     { 
      Service Mysvc = mc.Services["MSSQL$" + serverName.Split('\\')[1]]; 

      if (Mysvc.ServiceState == ServiceState.Running) 
      { 
       Mysvc.Stop(); 
       Mysvc.Alter(); 

       while (!(string.Format("{0}", Mysvc.ServiceState) == "Stopped")) 
       { 
        Mysvc.Refresh(); 
       } 
      } 

      ServerProtocol srvprcl = mc.ServerInstances[0].ServerProtocols[2]; 
      srvprcl.IsEnabled = true; 
      srvprcl.Alter(); 


      Mysvc.Start(); 
      Mysvc.Alter(); 

      while (!(string.Format("{0}", Mysvc.ServiceState) == "Running")) 
      { 
       Mysvc.Refresh(); 
      } 
      return true; 
     } 
     catch 
     { 
      MessageBox.Show("TCP/IP connectin could not be enabled."); 
      return false; 
     } 
    } 
+3

Esta fue una gran solución y requirió un par de cosas: 1) Agregue referencias a Microsoft.SqlServer.ConnectionInfo, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.Smo, Microsoft.SqlServer.SqlEnum, Microsoft. SqlServer.SqlWmiManagement y Microsoft.SqlServer.WmiEnum encontrados en C: \ Archivos de programa (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies 2) Agregue usando Microsoft.SqlServer.Management.Smo y use Microsoft.SqlServer.Management .Smo.Wmi. –

+0

Gran solución. Además del comentario de @PaulyGlott, también necesité agregar una línea: 'srv.Settings.Alter();' after 'srv.Settings.LoginMode = ServerLoginMode.Mixed;', de lo contrario, no guardaría la configuración modificada. –

3

yo era capaz de hacer esto con una pequeña huella mediante la ejecución de este procedimiento almacenado desde C#:

USE [master] 
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2 
GO 

No parece mucho, pero las obras de manera impecable e instantánea, sin reiniciar los servicios.

+0

Gracias Chris, pero parece que ya es demasiado tarde para responder a esto. – IrfanRaza

+0

¿se supone que esto también cambia el 'TCPIP' y' NamedPipes'? ¿o solo cambia 'ServerLoginMode' a' Mixed'? – Niklas

Cuestiones relacionadas