none
VisualStudio2008でのセットアッププロジェクトについて RRS feed

  • 質問

  • はじめまして。

     

    現在、VisualStudio2008を使用してセットアップを作成しており、

    以下のことを実現したいのですが、うまくいかず困っております。

    【実現したい事】

    1.セットアップ時にSQLServer2005 ExpressEditionもインストールしたい。

    ※  必須コンポーネントにチェックを入れ試したのですが、ManagementStudioしかインストールされませんでした。

    2.SQLServer認証を有効にしたい。

    3.SQLServerのバックアップファイルをセットアップ時に復元したい。

    【開発環境】

    OS:WindowsXP SP3

    色々とサイトを調査したのですが、解決できずに困っております。

    どなたか作成方法をご存知の方いらっしゃいませんでしょうか?

    2011年8月3日 1:43

回答

  • VBSからSMOを操作してパスワード設定するなら、こんな感じ
    Dim svr
    set svr=CreateObject("Microsoft.SqlServer.Management.Smo.Server")
    Dim settings
    set settings=svr.Settings
    Dim modeText
    
    select case settings.LoginMode
    case 0
      modeText="Normal"
    case 1
      modeText="Integrated"
    case 2
      modeText="Mixed"
    case 9
      modeText="Unknown"
    end select
    
    
    if (settings.LoginMode<>2) then
      settings.LoginMode=2
    end if
    
    'Dim col
    'dim col
    'set col=CreateObject("System.Collections.Specialized.StringCollection ") '作成できない
    'col.Add("C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test.mdf")
    'call svr.AttachDatabase("Test",col)
    
    Dim login
    for each login in svr.Logins
      if login.Name="sa" then
        Call login.ChangePassword("****")
        Call login.Enable()
      end if
    next
    
    
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク shino555 2011年8月5日 7:58
    2011年8月4日 3:56

すべての返信

  • 1点勘違いをしておりました、下記のように書いておりましたがデータベースは正常にインストールされておりました。

    ※  必須コンポーネントにチェックを入れ試したのですが、ManagementStudioしかインストールされませんでした。

     

    ただし、2と3の実現方法が分かっていない為、引き続き宜しくお願い致します。

    2011年8月3日 2:51
  • カスタム動作でSQLServer認証を有効にしたり復元の動作を実行すればいいのではないでしょうか。

    たとえばVBSのようなスクリプトからosql.exeやsqlcmd.exeを呼び出してT-SQLで設定するとか。

    あるいはカスタム動作で、SQL Server Managemento Object(SMO)をつかうとしたら、

    Microsoft.SqlServer.Management.Smo.Server svr = new Microsoft.SqlServer.Management.Smo.Server();
    svr.Settings.LoginMode = Microsoft.SqlServer.Management.Smo.ServerLoginMode.Mixed;
    
    System.Collections.Specialized.StringCollection col = new System.Collections.Specialized.StringCollection();
    col.Add(@"C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test.mdf");
    svr.AttachDatabase("DatabaseName", col);//アタッチの場合
    

    みたいにするとか。
    #VBSからSMO呼んだらStringCollectionsが使えなかったorz


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    2011年8月3日 14:28
  • 回答ありがとうございます。

    教えていただいた事を試しているところ。

    ちなみにVBScript・SMOを使用してSAのパスワードの設定は可能なのでしょうか?

     

    2011年8月4日 2:42
  • VBSからSMOを操作してパスワード設定するなら、こんな感じ
    Dim svr
    set svr=CreateObject("Microsoft.SqlServer.Management.Smo.Server")
    Dim settings
    set settings=svr.Settings
    Dim modeText
    
    select case settings.LoginMode
    case 0
      modeText="Normal"
    case 1
      modeText="Integrated"
    case 2
      modeText="Mixed"
    case 9
      modeText="Unknown"
    end select
    
    
    if (settings.LoginMode<>2) then
      settings.LoginMode=2
    end if
    
    'Dim col
    'dim col
    'set col=CreateObject("System.Collections.Specialized.StringCollection ") '作成できない
    'col.Add("C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\Test.mdf")
    'call svr.AttachDatabase("Test",col)
    
    Dim login
    for each login in svr.Logins
      if login.Name="sa" then
        Call login.ChangePassword("****")
        Call login.Enable()
      end if
    next
    
    
    


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
    • 回答としてマーク shino555 2011年8月5日 7:58
    2011年8月4日 3:56
  • ご回答ありがとうございます。

     

    gekka様のような方法ではうまくできなかった為(スキルが足りない為に。。。)、

    以下のようにしました。

     

    Option Explicit

    '=======================================
    '    定数定義
    '=======================================
    Const SQLSERVER_SERVICE = "MSSQLSERVER"
    Const LOGIN_SERVER = "LOCALHOST\SQLEXPRESS"
    Const SETTING_FILE = ".\sa.sql"
    Const CREATE_FILE = ".\create.sql"

    '=======================================
    '    変数定義
    '=======================================
    Dim WshShell

    Set WshShell = WScript.CreateObject("WScript.Shell")

    '=======================================
    '    saユーザ有効化
    '=======================================
    Call WshShell.Run("sqlcmd -E -S " & LOGIN_SERVER & " -i " & SETTING_FILE, 0, True)

    '=======================================
    '    データベース作成
    '=======================================
    Call WshShell.Run("sqlcmd -E -S " & LOGIN_SERVER & " -i " & CREATE_FILE, 0, True)

    '=======================================
    '    SQLServer認証モード変更
    '=======================================
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\LoginMode", 2, "REG_DWORD"

    '=======================================
    '    TCP/IP有効化
    '=======================================
    WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib\Tcp\Enabled", 1, "REG_DWORD"

    '=======================================
    '    SQLServer再起動
    '=======================================
    Dim objService

    Call MsgBox("停止処理を行います")
    For Each objService In GetServices()
     Call objService.StopService

     Do Until ChkServiceState("Stopped")
      Call WScript.Sleep(100)
     Loop
    Next

    Call MsgBox("停止処理が完了したので、起動処理を行います")
    For Each objService In GetServices()
     Call objService.StartService

     Do Until ChkServiceState("Running")
      Call WScript.Sleep(100)
     Loop
    Next
    Call MsgBox("起動処理完了")

    '=======================================
    '    関数
    '=======================================
    Function GetServices()
     Dim l_strSQL
     l_strSQL = "SELECT * FROM WIN32_SERVICE WHERE Caption = '" & SQLSERVER_SERVICE & "'"
     Set GetServices = GetObject("winmgmts:").ExecQuery(l_strSQL)
    End Function

    Function ChkServiceState(p_Status)
     Dim objService

     ChkServiceState = False

     For Each objService In GetServices()
      ChkServiceState = CBool(objService.State = p_Status)
     Next
    End Function

    明日これをセットアップに組み込んでみようかと思います。

    2011年8月4日 10:57
  • 上記のスクリプトでなんとかセットアップできました。

     

    gekka様助言ありがとうございました。

    2011年8月5日 7:58