
_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 を指定しています。
サービスの何らかの情報を継承しているのでしょうか。
回避策、アドバイスなど、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
#1です。
ダイアログを表示する必要があったんですね。
別のユーザでサービスログインした場合には、ログインしているユーザとは別の
ウィンドウステーションでウィンドウが作成される為そのままではダイアログ
は見えなくなります。
対処方法としては
1.Dialogを表示する際にデスクトップのウィンドウステーションを取得し、割り当てる
2.ローカルシステムアカウントで起動しCreateProcessAsUserで子プロセスを起動する。
等が考えられます。
いろいろとアドバイス、ありがとうございました。
私も CreateProcessAsUser関数を見つけて、実行しようとしたのですが、
その前の LogonUser関数がエラーに。。。
どうやら「特権」がポイントらしいのですが、、、
ヘルプを見ながら頑張ってみます。
#それにしても、ヘルプの記述は理解しにくい。。。
今回は本当にありがとうございました。
No.2
- 回答日時:
サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。
NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。
そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。
サービスプロセスが作ったプロセスはサービスプロセスで動くので、ユーザーの権限では動いていません。
lpSecurityAttributesにNULLを指定しても、ハンドルが継承されないだけで、アクセス権や所有者については親から継承されてしまいます。
Cのランタイム関数は、プロセスがNT上で何かを処理する権限うんぬんで動いていないので、当てにしないほうがいいですよ。
最近プロセスとかスレッドとか勉強中の、はぽるんでした。
No.1
- 回答日時:
恐らくサービスで起動しているプログラムAに設定してあるログオンユーザに
別のマシンを参照する権限がないんじゃないでしょうか?
サービスのログオンの設定をローカルシステムアカウントを使用せずに
明示的にアカウントを指定してみてはどうでしょうか。
この回答への補足
素早い回答ありがとうございました。
しかしながら、次なる問題に悩まされています。。。
Aのサービスにおいて、「アカウント」を指定しました。
しかし、Bが正常に動作しませんでした。
プロセスとしては存在していましたが、ダイアログが表示されませんでした。
(BはダイアログベースのEXEです)
推測ですが、、、
変更前は「ローカルシステムアカウント」を指定して、さらに
「デスクトップとの対話をサービスに許可」もチェックされていました。
「アカウント」指定したことにより、
「デスクトップとの対話をサービスに許可」という設定ではなくなり、
ダイアログが表示されなかったのでしょうか?
ネットワーク間アクセスするには「アカウント」指定する。
しかし、「アカウント」指定するとダイアログが表示されない。。。
ご迷惑をおかけしますが、何かよい解決策があればアドバイスお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の関数のextern宣言
-
DLLファイルの逆コンパイラにつ...
-
C言語 関数、変数の宣言について
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語について(初心者)
-
C言語のことです。写真(見にく...
-
C#でTreeViewのCheckBoxのサイ...
-
VisualStudio2022でC言語プログ...
-
アセンブラ指令
-
私は
-
コンソールアプリを作成するの...
-
複素関数はどこはあんまりやら...
-
プログラム言語について c言語...
-
Notepad++の関数リスト表示の変...
-
gccを行ってもexeファイルが生...
-
c言語
-
C言語について。
-
C#でゲームのチートを作ること...
-
c#のTLS1.2での通信について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
バッチファイルで多重起動を防ぐ
-
VBでExcelが起動されているか知...
-
Linux環境変数設定(putenv?se...
-
コンソールアプリの起動結果待...
-
CreateProcessでコンソールアプ...
-
VB6 二重起動確実防止について
-
プリンタの状態を知る方法
-
常駐し他のプロセスの起動を取...
-
MySQLへのDB::connectで、faile...
-
ASP.NET 2.0(VB)からEXCELオブ...
-
CreateProcessでうまくexeファ...
-
Open Office Org 急に起動しな...
-
外部プロセス起動時に発生する...
-
「応答なし」の状態を監視する方法
-
CGIからのメール送信が重く・・・
-
telnetを抜けても、プロ...
-
system関数について
-
visual studioで作成したプログ...
-
バッチファイル内置換
おすすめ情報