• ベストアンサー

_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 を指定しています。 サービスの何らかの情報を継承しているのでしょうか。 回避策、アドバイスなど、よろしくお願いします。

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

  • ベストアンサー
  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.3

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

nabezo-
質問者

お礼

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

その他の回答 (2)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。 NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。 そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。 サービスプロセスが作ったプロセスはサービスプロセスで動くので、ユーザーの権限では動いていません。 lpSecurityAttributesにNULLを指定しても、ハンドルが継承されないだけで、アクセス権や所有者については親から継承されてしまいます。 Cのランタイム関数は、プロセスがNT上で何かを処理する権限うんぬんで動いていないので、当てにしないほうがいいですよ。 最近プロセスとかスレッドとか勉強中の、はぽるんでした。

nabezo-
質問者

お礼

アドバイス、ありがとうございました。 セキュリティは難しいですね。。。 これをきっかけに勉強しようと思います。

  • akinori_s
  • ベストアンサー率60% (21/35)
回答No.1

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

nabezo-
質問者

補足

素早い回答ありがとうございました。 しかしながら、次なる問題に悩まされています。。。 Aのサービスにおいて、「アカウント」を指定しました。 しかし、Bが正常に動作しませんでした。 プロセスとしては存在していましたが、ダイアログが表示されませんでした。 (BはダイアログベースのEXEです) 推測ですが、、、 変更前は「ローカルシステムアカウント」を指定して、さらに 「デスクトップとの対話をサービスに許可」もチェックされていました。 「アカウント」指定したことにより、 「デスクトップとの対話をサービスに許可」という設定ではなくなり、 ダイアログが表示されなかったのでしょうか? ネットワーク間アクセスするには「アカウント」指定する。 しかし、「アカウント」指定するとダイアログが表示されない。。。 ご迷惑をおかけしますが、何かよい解決策があればアドバイスお願いします。

関連するQ&A

  • Excel と Access または、Access と Excel との連携処理

    (1)(初期処理として)、Excel(1.xls)よりアイテムセットしたパラメータ(起動するAccessのパス名)でAccess(A.mdb)を起動する。 (2)Access(A.mdb)の自動処理が終わると、次に起動させるAccess(B.mdb)のパスパラメータをExcel(1.xls)に渡し、Access(A.mdb)を終了する。 (3)パラメータを受け取ったExcel(1.xls)は、Access(B.mdb)を起動し、処理をする。 (1)より開始して、(2)(3)の繰り返し出来る方法を教えてください。 よろしくお願いします。

  • アクセス DLookup関数 なぜエラーになるのか

    アクセス DLookup関数 なぜエラーになるのかわからないです。 testと言うテーブルがあり、a・bと言うフィールドがあります。 aフィールドにあああと入ってる場合のbフィールドの値を取得したいのですが Debug.Print DLookup("[b]", "test", "[a] = あああ") だと、 実行時エラー2471「クエリ パラメータとして指定した式でエラー'[あああ]'が発生しました。」 になります。 どこがおかしいのか教えていただけますか?

  • Access95→Access2000への変換について。

    こんにちは。 Access95で作成したプログラムを、Access2000に変換して使用したいので、 Access2000で95のバージョンのプログラムを開き、データベースの変換を したのですが、なんだか上手くいきません。 (1)「起動時の設定」をしていないのに、起動時の設定がかかる (データベースウィンドウの表示など) (2)95のときは出ていなかったエラー(パラメータの入力)を求められる (3)フォームのコードを開いて、コンパイルをかけようとしてもグレー表示に  なっているため使用できない 以上、おかしいと思われる点ですが、95のプログラムは私が作成したものでは ないため、詳しいことがよく分からないのです。 データベースはテーブルのみのもの(仮にAとします)と、Aからリンクした テーブル、クエリ、フォーム、レポート、モジュールなどがあるデータベース (Bとします)の二つのデータベースを使用しています。 私のコンピュータの環境としては、 OSはWindows98 Second Edition、 Accessは97と2000が入っていますが95は入っていません。 大至急何とかしたいのですが、よろしくお願いします。

  • Microsoft Accessが起動できなくなりました。

    Microsoft Accessが起動できなくなりました。 Microsoft Access(アクセス)が起動できなくなりました。 ウイルス対策ソフトを入れたのですが、重くなるのがいやだったので、 同時に不要なサービスの停止を行っています。 するとエラーメッセージ 「ディスクまたはネットワークのエラーです」 ⇒OKを押すと⇒ 「システムエラーまたはメモリ不足のため、Microsoft Accessを起動できません。 不要なプログラムを終了して、再度実行してください。」 と出ます。 どうすればよいでしょうか?

  • Access-Runtimeについて

    Access2000でデータベースパスワード付きのmdb(DB_A.mdb)を起動するためのDB(DB_B.mde)を作成しました。 DB_B.mdeからDB_A.mdbを起動させるために"CreateObject"を使っていますが、RuntimeではCreateObjectを受け付けてくれません。 CreateObject("Access.Application")に相当するものをご存知の方、ご教授いただけませんか? よろしくお願い致しますm(_ _)m

  • C++ で、 "access violation"

    作っていたプログラムに、ある関数をいれました。 コンパイルはできたのですが、その関数を定義している行まで実行したら、そこで、"access violation"のエラーがでて、とまります。 その関数は、複素数の計算をしているのですが、複素数として定義した変数をすべて消すとこのエラーはなくなりました。しかし、複素数の計算をする必要があるので、それでは困ります。 また、その関数をただ呼び出すだけの簡単なプログラムを作ったところ、問題なく動きました。 何か考えられる問題はないでしょうか? 初心者なので、かなり初歩的なことかもしれないのですが、自分としてはなぜこうなるのか、分かりません。チェックの仕方なども含めて、アドバイスいただきたいです。

  • ACCESS文字連結

    ACCESSでひとつの項目の文字を編集したい。 後ろに文字を追加したいのですが、関数がわかりません。 例 A00001 B00002 C0003 Aを追加する。 A00001A B00002A C0003A 宜しくお願いします。

  • system関数のエラー検出

    UNIXのmanで調べたところ、system関数(コマンド)はエラー時、-1をかえし、errnoに"EAGAIN","EINTR","ENOMEN"を代入するようなのですが、 実際にプログラムにくみこんでみると、1を返しているようです。 (systemで実行するコマンド名をわざと間違えて実行しています。) これでは、systemで実行しようとしているコマンドが1を返しているのか、systemでエラーが起きているのか判断できません。 どのように判定すればよいのでしょうか。

  • ネットワークパスが見つかりません、というエラー

    AマシンとBマシンはネットワークでつながってます。 しかし、AからBの中身をみようとすると 「ネットワークパスが見つかりません」 というエラーになります。 Bからネットワーク全体→でみようとすると、 そのワークグループには、自分のマシンしか 見えません。 Bマシンで、 Pingをうっても返ってきますし、 Ipconfigうっても、IPアドレスはとれてます。 なにか解決策を教えてください。

  • Access:IIf関数について

    Accessの関数の記入方法について教えてください。 テーブルで2つの日付が入っています。 形式はyyyy/mm/ddの日付型です。 日付Aと日付Bとして、同じ日付が入っているかもしくは日付Aの方が古い日付が入っています。 IIfで判定を入れたいのですが、同日もしくはAから1か月以内にBの日付が入っていたら、〇としたいです。 全体像がわかりにくく申し訳ないのですが、何かヒントをいただければ助かります。 よろしくお願いいたします。

専門家に質問してみよう