OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

_access関数が EACCES エラーとなる

  • すぐに回答を!
  • 質問No.217793
  • 閲覧数918
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 71% (83/116)

_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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル8

ベストアンサー率 60% (21/35)

#1です。
ダイアログを表示する必要があったんですね。
別のユーザでサービスログインした場合には、ログインしているユーザとは別の
ウィンドウステーションでウィンドウが作成される為そのままではダイアログ
は見えなくなります。
対処方法としては
1.Dialogを表示する際にデスクトップのウィンドウステーションを取得し、割り当てる
2.ローカルシステムアカウントで起動しCreateProcessAsUserで子プロセスを起動する。
等が考えられます。
お礼コメント
nabezo-

お礼率 71% (83/116)

いろいろとアドバイス、ありがとうございました。
私も CreateProcessAsUser関数を見つけて、実行しようとしたのですが、
その前の LogonUser関数がエラーに。。。
どうやら「特権」がポイントらしいのですが、、、
ヘルプを見ながら頑張ってみます。
#それにしても、ヘルプの記述は理解しにくい。。。
今回は本当にありがとうございました。
投稿日時 - 2002-02-19 10:39:54
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル8

ベストアンサー率 60% (21/35)

恐らくサービスで起動しているプログラムAに設定してあるログオンユーザに 別のマシンを参照する権限がないんじゃないでしょうか? サービスのログオンの設定をローカルシステムアカウントを使用せずに 明示的にアカウントを指定してみてはどうでしょうか。 ...続きを読む
恐らくサービスで起動しているプログラムAに設定してあるログオンユーザに
別のマシンを参照する権限がないんじゃないでしょうか?
サービスのログオンの設定をローカルシステムアカウントを使用せずに
明示的にアカウントを指定してみてはどうでしょうか。
補足コメント
nabezo-

お礼率 71% (83/116)

素早い回答ありがとうございました。
しかしながら、次なる問題に悩まされています。。。

Aのサービスにおいて、「アカウント」を指定しました。
しかし、Bが正常に動作しませんでした。
プロセスとしては存在していましたが、ダイアログが表示されませんでした。
(BはダイアログベースのEXEです)
推測ですが、、、
変更前は「ローカルシステムアカウント」を指定して、さらに
「デスクトップとの対話をサービスに許可」もチェックされていました。
「アカウント」指定したことにより、
「デスクトップとの対話をサービスに許可」という設定ではなくなり、
ダイアログが表示されなかったのでしょうか?

ネットワーク間アクセスするには「アカウント」指定する。
しかし、「アカウント」指定するとダイアログが表示されない。。。

ご迷惑をおかけしますが、何かよい解決策があればアドバイスお願いします。
投稿日時 - 2002-02-14 21:15:13


  • 回答No.2
レベル12

ベストアンサー率 40% (230/562)

サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。 NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。 そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。 サービスプロセスが作ったプロセスはサービスプロセスで動くので、ユーザーの権限では動いていません。 lpSecuri ...続きを読む
サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。
NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。
そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。

サービスプロセスが作ったプロセスはサービスプロセスで動くので、ユーザーの権限では動いていません。
lpSecurityAttributesにNULLを指定しても、ハンドルが継承されないだけで、アクセス権や所有者については親から継承されてしまいます。

Cのランタイム関数は、プロセスがNT上で何かを処理する権限うんぬんで動いていないので、当てにしないほうがいいですよ。

最近プロセスとかスレッドとか勉強中の、はぽるんでした。
お礼コメント
nabezo-

お礼率 71% (83/116)

アドバイス、ありがとうございました。
セキュリティは難しいですね。。。
これをきっかけに勉強しようと思います。
投稿日時 - 2002-02-19 10:42:33
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ