- ベストアンサー
_access関数が EACCES エラーとなる
_access関数が EACCES エラーとなる問題があり、識者の方、どうか ご教授願います。 <環境> ・Windows2000 Pro ・VC++ 6.0 事象の説明を以下にします。 A、B、Cの3つのプログラムがあります。 A:サービスから起動されるプログラム B:Aから CreateProcess関数により起動される。 Cを CreateProcess関数により起動する。 C:Bから CreateProcess関数により起動される。 _access関数で、ネットワーク上の別のマシンの共有されている フォルダをアクセスする。 上記の環境で、A→B→Cと起動し、Cがネットワーク上の別のマシンを アクセスしようとすると EACCES のエラーになります。 (EACCES は errno.h で定義されています。) しかし、サービスのAからではなく、Bから起動した場合は正常に アクセスできます。 C単体でもOKでした。 A、B共に、CreateProcess関数の第3、4パラメータのセキュリティ関連の パラメータには NULL を指定しています。 サービスの何らかの情報を継承しているのでしょうか。 回避策、アドバイスなど、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 ダイアログを表示する必要があったんですね。 別のユーザでサービスログインした場合には、ログインしているユーザとは別の ウィンドウステーションでウィンドウが作成される為そのままではダイアログ は見えなくなります。 対処方法としては 1.Dialogを表示する際にデスクトップのウィンドウステーションを取得し、割り当てる 2.ローカルシステムアカウントで起動しCreateProcessAsUserで子プロセスを起動する。 等が考えられます。
その他の回答 (2)
- haporun
- ベストアンサー率40% (230/562)
サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。 NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。 そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。 サービスプロセスが作ったプロセスはサービスプロセスで動くので、ユーザーの権限では動いていません。 lpSecurityAttributesにNULLを指定しても、ハンドルが継承されないだけで、アクセス権や所有者については親から継承されてしまいます。 Cのランタイム関数は、プロセスがNT上で何かを処理する権限うんぬんで動いていないので、当てにしないほうがいいですよ。 最近プロセスとかスレッドとか勉強中の、はぽるんでした。
お礼
アドバイス、ありがとうございました。 セキュリティは難しいですね。。。 これをきっかけに勉強しようと思います。
- akinori_s
- ベストアンサー率60% (21/35)
恐らくサービスで起動しているプログラムAに設定してあるログオンユーザに 別のマシンを参照する権限がないんじゃないでしょうか? サービスのログオンの設定をローカルシステムアカウントを使用せずに 明示的にアカウントを指定してみてはどうでしょうか。
補足
素早い回答ありがとうございました。 しかしながら、次なる問題に悩まされています。。。 Aのサービスにおいて、「アカウント」を指定しました。 しかし、Bが正常に動作しませんでした。 プロセスとしては存在していましたが、ダイアログが表示されませんでした。 (BはダイアログベースのEXEです) 推測ですが、、、 変更前は「ローカルシステムアカウント」を指定して、さらに 「デスクトップとの対話をサービスに許可」もチェックされていました。 「アカウント」指定したことにより、 「デスクトップとの対話をサービスに許可」という設定ではなくなり、 ダイアログが表示されなかったのでしょうか? ネットワーク間アクセスするには「アカウント」指定する。 しかし、「アカウント」指定するとダイアログが表示されない。。。 ご迷惑をおかけしますが、何かよい解決策があればアドバイスお願いします。
お礼
いろいろとアドバイス、ありがとうございました。 私も CreateProcessAsUser関数を見つけて、実行しようとしたのですが、 その前の LogonUser関数がエラーに。。。 どうやら「特権」がポイントらしいのですが、、、 ヘルプを見ながら頑張ってみます。 #それにしても、ヘルプの記述は理解しにくい。。。 今回は本当にありがとうございました。