
_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ランキング
-
コンソールアプリの起動結果待...
-
VBでExcelが起動されているか知...
-
誰かにサーバにあるデータを消...
-
Winでソフトのシリアル番号を調...
-
SolarisでJDKのインストール情...
-
大塚商会で新しくシステム、ス...
-
コマンド実行結果のファイル出力
-
Postfixでmailコマンドを使用し...
-
バッチファイル内置換
-
exeファイルの実行結果をテキス...
-
OpenLDAPでのユーザ一覧表示
-
DOS/Vを英語モードにする?
-
パソコンの画像データを削除し...
-
メーリングリスト宛てのメール...
-
NERO9のアンインストールについて
-
自動釣銭機(富士電機ECS777)の...
-
centOS7サーバーに配置したHTML...
-
windows 10 mobile
-
Xserverを停止したいが、gdmが...
-
バッチファイルでのスペースの入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
VBでExcelが起動されているか知...
-
_access関数が EACCES エラーと...
-
バッチファイルで多重起動を防ぐ
-
CGIからのメール送信が重く・・・
-
Linux環境変数設定(putenv?se...
-
XDRIVEのログインをSENDKEYで自...
-
同じプロセスがある
-
system関数について
-
Httpステータス500 InternalSer...
-
MySQLへのDB::connectで、faile...
-
ラズパイ3でsocket接続できない。
-
デーモンプロセスの起動について
-
visual studioで作成したプログ...
-
コンソールアプリケーションの...
-
コンソールアプリの起動結果待...
-
仮想メモリ増加
-
OLEサーバコンポーネントを作っ...
-
起動したIEのウインドウタイ...
-
apache2.2が起動せず困っていま...
おすすめ情報