問題の切り分け

[戻る]
wood 2004/10/23(土) 08:09:30
問題の切り分けができず、質問します

1.VC側作成環境
  Windows XP Pro  VC++ 6.0(SP6)
  サービス.EXE     ビルド(Win32 Release Minisize)

2.VB側作成環境(他者作成)
  Windows NT4.0(SP6)
  VB6(SP5)
  ODBCDirectを使いSymfowareデータベースに
  RDA−SV ODBC3.0に接続

3.共用実行環境 
  上記開発環境とは別に  Windows NT4.0WS
  Symfowareデータベース
  それぞれ、ランタイムDLLのバージョンを開発環境で使用しているもの
  にあわせてあります
  
  1で作成したサービスEXEを
  コマンドラインから”サービスEXE /Service”でOSに登録
  サービスマネージャで「デスクトップとの対話をする」にチェックを
  入れてあります


それぞれ、共通でOffice2000(Pro)フルインストール

問題
 2の環境で作成されたVBアプリが、1の環境で作成したサービスEXEから
 CreateProcessにより起動されたときデータベースへの接続ができなくなってしまう

 また、バッチファイルを経由して
 起動前に”CD /D C:\XXX\CCCC"とVBアプリが入っているフォルダを
 指定してもDB接続ができません

 ノートパッド、コンソールアプリ、バッチファイルの起動はサービスEXEから
 正常に起動されます
 ほかのDBアプリケーションは試してません

 エクスプローラからVBアプリをダブルクリックで実行すると、正常に実行できます

 そこで、私が作成したサービスEXE側に問題があると思いこちら側に質問を行います

アプリケーション起動に使用しコード(抜粋)
    ZeroMemory( &si , sizeof( STARTUPINFO ));
    ZeroMemory( &pi , sizeof( PROCESS_INFORMATION ));
    si.cb        = sizeof( STARTUPINFO );
    si.dwFlags    = STARTF_USESHOWWINDOW;
    si.wShowWindow    = SW_SHOWNORMAL;
    
    //
    sprintf(CMD,"%s %s", ds_GROUP[u_idx].D_CMD , ds_GROUP[u_idx].D_OPT);
    RT_CD = CreateProcess(    NULL ,CMD ,NULL ,NULL ,FALSE ,
                        
    CREATE_NEW_PROCESS_GROUP, // 0
                        
    NULL ,NULL ,&si ,&pi);

ds_GROUP[u_idx].D_CMDの値はフルパス
ds_GROUP[u_idx].D_OPTの値はNULL

VBアプリ側の問題なのか、VC側(CreateProcessの使い方)の問題なのか切り分けが
出来ず困っています
もし仮にVBアプリ側だった場合、解説ページ等をご紹介ください

VB側やり取りは、掲示板趣旨と違いますし、私本人の作成物ではございません
ので申し訳ございませんが、作成者に伝えますが、ご返事いたし兼ねることが
ございます(VB側ラウンジへ移動します)マルチにならない様先にこちらで
質問しています

VC側がわであれば、ここで何が変なのか教えてください
よろしくお願いします。

wood 2004/10/23(土) 08:15:34
ちょっと訂正

(誤)VC側がわであれば、ここで何が変なのか教えてください
   よろしくお願いします。
  ↓
(正)VC側であれば、ここで何が変なのか教えてください

2004/10/25(月) 15:48:59
「自分ならばこうするだろうか」という観点から。

> 2の環境で作成されたVBアプリが、1の環境で作成したサービスEXEから
> CreateProcessにより起動されたときデータベースへの接続ができなくなってしまう

という記述をみると、「VBアプリの起動はできている」と受け取れます。
質問文からはVCサービスEXEでの CreateProcess は成功しているように受け取れます。

もしそうなら、VBアプリからデータベース接続できない処理を重点的に
調べたほうが良いように思います。

・VBアプリからデータベースへ接続する際のパラメータ
・VBアプリでのデータベース接続失敗時のエラー詳細

質問内容に要求されている回答とは違うかもしれませんが、一応ご参考に。

無実績 2004/10/25(月) 17:20:17
サービルからCreateProcessすると実行ユーザがSYSTEMになってたり
するけどそのあたりは大丈夫なつくりなのかなぁ?VB
CreateProcessAsUserあたりの偽装について調べてみると幸せになれたり。

wood 2004/10/30(土) 11:11:50
レスありがとうございます
>実行ユーザがSYSTEMになってたり
調べ方はわかりませんが、goolgeなどで検索してみます
>CreateProcessAsUserあたりの偽装について調べてみると
調べてみます

でも、何か渡し足りないからVB側がエラー(RDO系)起こすみたいです
今のところ何を渡すべきかいまだ不明です

エクスプローラからの実行はやはり、エラー出ません

ほかのアプリでも結構ですので、似たような経験を解決された方いませんでしょうか

mmE 2004/10/31(日) 04:23:29
>>実行ユーザがSYSTEMになってたり
>調べ方はわかりませんが、goolgeなどで検索してみます

「デスクトップとの対話をする」に設定したんですよね?
同様にサービスマネージャで「ローカルシステムアカウント」を選択して
いれば SYSTEM ですが (^^;
それだと、ローカルシステム上はオールマイティに近いですがネットワーク
参照の権限はありませんね。
ODBC 管理の設定(コントロールパネル)も確認する必要があるんじゃないで
しょうか。自分は DB には詳しくないのでよくわからないですが。

>>CreateProcessAsUserあたりの偽装について調べてみると
>調べてみます

サービス実行のユーザー設定を DB アクセスができている
ユーザーにして実行してみてはいかかでしょう。
もしも CreateProcessAsUser を使うためにプログラム中でユーザーパスワードを
扱う必要が出てくるようであれば、サービス設定で割り当てする運用にしたほうが
セキュリティ上は安全だと思います。

mmE 2004/10/31(日) 04:34:36
あと、他のサービス(DB接続のクライアントサービスとか)に依存するようなら、
そのサービスよりも後に起動されるように設定しておかないと。

wood 2004/11/06(土) 06:41:55
現象再確認しました

VBアプリのエラーは
実行時エラー:−2147467259(80004005)
[Microsoft][ODBC Driver Manager]データソース名および指定された既定のドライバー
が見つかりません

ですがVBアプリに限らず、VC6で作成したODBC接続アプリも同様の現象を発生することが
確認できました

どちらの場合も、ユーザー:Administrator で実行してます

wood 2004/11/06(土) 18:02:45
Win32 Console アプリから「wood 2004/10/23(土) 08:09:30」に提示したコードで
ODBC接続アプリを起動しましたがエラーは発生しませんでした

サービスとして登録された、アプリケーションから
ODBC接続を利用したアプリケーションを起動(CreateProcess)した場合だけ
ODBC接続の阻害をしているみたいです

wood 2004/11/06(土) 18:50:29
[[解決]]
以上のことから表題「問題の切り分け」結果として
VCで作成した自作サービスEXEに問題があるようです
目的は達成されたように見える「CreateProcess」の使い方
または実現方法に問題があるようです

何故、目的達成後(他のEXEの実行)の状態に問題が発生してしまうのか不明ですが

レス頂いた方々ご協力ありがとうございました

このスレッドをクローズし、後で別の観点での質問をしたいと思います

古いスレッドには追加発言できません。