2010-02-15 13 views
5

Proszę o uważne przeczytanie mojego pytania.Zmiana ustawień SQL Server programowo

Być może wiesz, kiedy instalujesz VS2005/2008 z wersją SQL Server Express, SQL Server działa domyślnie w trybie uwierzytelniania systemu Windows. Możesz użyć SQL Server Management Studio, aby zmienić tryb na tryb mieszany (tryb uwierzytelniania Windows i SQL Server).

Podobnie, aby umożliwić zdalne połączenie z serwerem SQL za pośrednictwem protokołu TCP/IP, należy użyć programu SQL Server Configuration Manager, a następnie wybrać opcję Protokół dla SQLEXPRESS, a następnie zmienić ustawienie opcji Tcp/IP.

Potrzebuję automatyzacji tego procesu programowo za pomocą C#. To znaczy, muszę napisać program C#, aby zmienić tryb lub zmienić ustawienia tcp/ip itp.

Czy ktoś może mi pomóc w tym, jak mógłbym to zrobić?

Dziękujemy za udostępnienie cennego czasu.

Odpowiedz

9

Powinieneś użyć SQL Server Management Objects (SMO) - jest to API do programowego zarządzania SQL Server.

UPDATE:

okazuje się być nieco kłopotliwe: Server.LoginMode (odczyt/zapis), Server.TcpEnabled i Server.NamedPipesEnabled (dostać tylko, niestety). W celu modyfikacji protokołów, trzeba zbadać Microsoft.SqlServer.Management.Smo.Wmi nazw (stąd dzieje z „drugiej stronie”):

  • ServerProtocol - reprezentuje protokołu Serwer
  • ServerProtocolCollection - zbiór wszystkie protokoły zdefiniowane na danym serwerze:
+0

Dzięki Alex za szybką odpowiedź. – IrfanRaza

+0

Zasugerowałeś to, ale nie znalazłem, gdzie w SMO możesz zmienić protokoły połączeń. Ale jest to najbardziej prawdopodobne miejsce, aby je znaleźć. – Will

+0

Dzięki Will, spróbuję zagłębić się w SMO. – IrfanRaza

2

Myślę, że możesz rozwiązać swój problem, tworząc cichą instalację wersji SQL Server Express, używając pliku konfiguracyjnego do procesu instalacji.

W łączu this można znaleźć parametry wiersza polecenia dla instalacji.

W pliku this one można znaleźć informacje dotyczące tworzenia pliku konfiguracyjnego.

+0

Dzięki Jonathan, ale nie chcę tego. Ponieważ muszę zmienić ustawienia dla już zainstalowanego produktu. – IrfanRaza

+0

Och! Ok: D. Powodzenia! Odpowiedź AlexS Answer to dobry punkt wyjścia. – Jonathan

4

Co z modyfikowaniem rejestru?

Ustawienia protokołu klienta są przechowywane tutaj: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSSQLServer \ Client \ SNI9.0 Sprawdź ProtocolOrder.

Tryb uwierzytelniania przechowywane są tutaj: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ MSSQLServer \ LoginMode

Patrz: Authentication Settings

+0

Dzięki stary! Wydaje się, że kolejna miła rzecz. – IrfanRaza

5

Ta funkcja w C# pozwoli TCP/IP Protocol i ustaw tryb logowania na tryb mieszany.

Zobacz informacje uzupełniające here.

oto kod:

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

To było świetne rozwiązanie i wymagało kilku rzeczy: 1) Dodaj odsyłacze do Microsoft.SqlServer.ConnectionInfo, Microsoft.SqlServer.Management.Sdk.Sfc, Microsoft.SqlServer.Smo, Microsoft.SqlServer.SqlEnum, Microsoft. SqlServer.SqlWmiManagement i Microsoft.SqlServer.WmiEnum znalezione w C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ SDK \ Assemblies 2) Dodaj za pomocą Microsoft.SqlServer.Management.Smo i za pomocą Microsoft.SqlServer.Management .Smo.Wmi. –

+0

Świetne rozwiązanie. Oprócz komentarza @PaulyGlott, musiałem również dodać linię: 'srv.Settings.Alter();' after 'srv.Settings.LoginMode = ServerLoginMode.Mixed;', w przeciwnym razie nie zapisałoby zmienionego ustawienia. –

3

udało mi się zrobić to z niewielkich rozmiarów poprzez wykonanie tej procedury przechowywanej od C#:

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

To nie wygląda dużo ale działa bezbłędnie i natychmiastowo, bez ponownego uruchamiania usług.

+0

Dzięki Chris, ale wydaje się, że jesteś za późno, aby odpowiedzieć na to pytanie. – IrfanRaza

+0

ma to również zmienić "TCPIP" i "NamedPipe"? czy zmienia tylko 'ServerLoginMode' na' Mixed'? – Niklas

Powiązane problemy