- PR -

セットアップでSQLServerのインストールもできるようにしたい

1
投稿者投稿内容
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-06-20 11:11
いつもお世話になります。

多数のユーザにWindowsアプリを配布するにあたって、
アプリで使用するDB環境のインストールをダブルクリックなどの
1アクションで行えるファイルを作成するように指示をうけました。


そこで、.NET2005のセットアッププロジェクトを利用して、DB環境の作成を行おうとしています。

セットアップの処理で行いたいのは以下のとおりです。

1、SQLServer2005Expressのインストール
2、DBの作成
3、テーブルの作成

こちらのサイトを参考に、インストール時に上記の処理を行おうとしています。
http://dobon.net/vb/dotnet/deployment/customaction.html

1、の処理は以下のようにしました。

Dim sAppPath As String = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)

Shell(sAppPath & "\SQLEXPR_JPN.exe /qb SECURITYMODE=SQL SAPWD=XXX instancename=SQLEXPRESS ADDLOCAL=All DISABLENETWORKPROTOCOLS=0", , True)

この後に2、3の処理が続きます。

本来ならセットアッププロジェクトの「必須コンポーネント」でSQLServerを選択すればラクなのですが、リーダーの指示により、「Windows/SQLServer混合認証」でインストールしたいという事と、saユーザのパスワードをインストール時に指定したいのとで、このような方法をとっています。

dllのinstallイベントで無事にSQLEXPR_JPN.exeを起動することが出来たのですが、
「他のプログラムのインストール中です」の旨のエラーになってしまいます。

・・・まあ、言われてみればそりゃそうだよね;という感じなのですが、お客さんのPCスキルがマチマチな為、圧縮ファイルをダウンロードして、ダウンロードしたファイルを解凍して、そのなかの○○ファイルをダブルクリックして下さい」みたいな事は極力避けたい為、このような事を試みています。

ダウンロードしたファイルを1回ダブルクリックするだけで一連の処理が行われるようにしたいのですが・・・。

インストールイベントではなくて、コミットイベントに書こうかとも考えてみましたが、コミットイベントって通常走らないんですね。メッセージボックス表示を試してみましたが、表示されませんでした。


何か良い方法をご存知の方はいらっしゃいませんでしょうか。
アドバイスよろしくお願いいたします。

[ メッセージ編集済み 編集者: reiko 編集日時 2007-06-20 11:12 ]
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-06-20 12:46
引用:

本来ならセットアッププロジェクトの「必須コンポーネント」でSQLServerを選択すればラクなのですが、リーダーの指示により、「Windows/SQLServer混合認証」でインストールしたいという事と、saユーザのパスワードをインストール時に指定したいのとで、このような方法をとっています。


それは「必須コンポーネント」では不可能なことなのでしょうか。
「必須コンポーネント」をカスタマイズしてみるとかどうでしょうか、
「必須コンポーネント」は開発環境のたぶん
C:\Program Files\Microsoft.NET\SDK\v2.0\BootStrapper\Packages\
または
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\
に実際のファイルがあると思います。

product.xmlやpackage.xmlを編集してみるという手はありませんでしょうか。
独自の必須コンポーネントもほかのものを真似してこのフォルダに置けば実現できますよ。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-06-20 13:27
あ、既にコメントが入ってるw

ってことで、具体的なカスタマイズのやり方を書いておきます。

まず、SqlExpress というフォルダを同一階層に別名でコピーします。
#MySqlExpressなど、名前がバッティングしなければなんでも良い

次に Product.xml をXMLを読み書きできるエディタで開き、ルートのProduct タグの
ProductCode を適当に書き換えます。
この名前が内部識別子になりますので、必ずユニークな名前になるようにしてください。

さらにja フォルダ内のPackage.xml を開き
Strings タグ(最後にある)のName="DisplayName" のInnerTextを適当に書き換えます。
こちらが、必須コンポーネントの一覧で表示される名前になります。こちらは重複していても問題ありませんが、どちらを選択したかが判断できないので、ユニークになるようにしておくことをお勧めします。

続いて、Command タグ(SqlExpressでは2こあります)のPackageFile 属性の内容を都合のいいものに修正します。

これらの作業を終えたら念のために一度VS2005を終了し、改めて該当プロジェクトで必須コンポーネントの一覧を出すと
追加したものが選択できるようになります。

アップデートなどで更新されることがありますので、既存のものをそのまま書き換えてしまうのは危険ですが、
上記のようにコピーした上で、別のパターンにするのであればVS(.NETSDK)のインストーラは関与しませんんで影響することもありません。

より詳しい内容については、「ClickOnce Product」でお手持ちのMSDNライブラリを検索してください。
各要素の詳細が「日本語」で書かれたページがあります。



ただし、この方法には致命的な欠点があります。
それは、内部に抱え込んでいるとはいえ、パスワードがそのまま記載されてしまっていることです。

そのため、「通常」このような運用形態は取りません。

パスワードがそのまま入った形でエンドユーザーの手元に渡ってしまうことになり、
融通が利かないどころか、悪意のあるユーザーがそのパスワードを盗み見てしまうという可能性も否定できません。

SQL Server についてはほとんど知らないに等しいので出来るかどうかはわかりませんが、
ファイルアタッチなどですますという訳にはいかないのでしょうか?

その形式なら、もろもろの情報はデータベース内に隠蔽してしまえますし、mdf ファイルをインストールセットに含めて、カスタム動作で登録だけするという形にすることもできると思います。

このあたりは、DB系の会議室で質問した方がいいかもしれません。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-06-20 15:13
IIJIMASさん、とっちゃんさん、早速のご回答ありがとうございました。
アドバイスいただいたとおり、必須コンポーネントをカスタマイズする方法で希望の処理を行う事が出来ました。

既存のコンポーネントをカスタマイズできることも、独自のコンポーネントを追加できる事も知らなかった私・・・。かなり勉強になりました。

パスワードの件に関しては、確かにおっしゃるとおりです・・・。
全然考慮してませんでした(恥) 早速SEに相談してみました。

結果、今回のシステムはWebアプリが基本にあります。
Windowsアプリは、業務上ネットを利用できない環境での登録作業をどうしても行わなくてはいけない部分がありまして、ローカルで登録処理を行い、Webアプリとの連携データをcsvで作成するという小さなプログラムですので考慮しない事になりました^^;

とても助かりました。本当にありがとうございました。

reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-06-20 15:29
度々失礼します。
ひとつ気になったので追加質問しても良いですか?
配布ファイルの中で、パスワードが記載される場所というのはどこになるのでしょうか?

必須コンポーネントのインストール場所を選ぶところで
「アプリケーションと同じ場所から必須コンポーネントをダウンロードする」を選択すると、
Setup.exeやmsiファイルが作成される場所に必須コンポーネントのインストールファイルが作成されますが、そのSQLServerのフォルダ内を見たら、「sqlexpr32.exe」しかありませんでした。
msiファイルをOrcaで見たらわかるのでしょうか?(私は見つけられなかったのですが^^;)

今回の業務には関係ないのですが、勉強のために教えて頂けると嬉しいです。
何卒よろしくお願い致します。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-06-20 15:52
ばらしちゃっても問題ないですか?

とはいえ、誰が観てるかわからん場所なので、場所だけ。Setup.exe の「中」に情報があります。

特殊なツールなどが必要なわけではありません。VSを持ってる人ならだれにでも簡単に見ることができます。
固定のシリアルなどであれば、それほど大きな問題にはなりませんが、パスワードなので、非常に危険であるという事を改めて書いておきます。

もっとも、package.xml を参照できる人には筒抜けであることも問題なわけですけどw
_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-06-20 16:04
とっちゃんさん、早速のご回答ありがとうございます。

>ばらしちゃっても問題ないですか?

確かにこういう質問事態、掲示板で行うのは間違いだったかもしれません。
大変失礼しました。

>パスワードなので、非常に危険であるという事を改めて書いておきます。

ありがとうございます。私に決定権がないので今回はこのままGOするしかありませんが、今後のために私はしっかりと肝に銘じておきたいと思います。

大変お世話になりました。ありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)