_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 を指定しています。
サービスの何らかの情報を継承しているのでしょうか。

回避策、アドバイスなど、よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#1です。


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

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

お礼日時:2002/02/19 10:39

サービスはLocalSystemアカウント権限で動いていて、この権限がまた変なので、困ったものです。


NT上では、ランタイム関数のファイル系はいい加減なことを言うときもあるので、APIにしたほうがいいですよ。
そりゃ、SecurityDiscriptorは複雑で意味不明ですけど。

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

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

最近プロセスとかスレッドとか勉強中の、はぽるんでした。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/02/19 10:42

恐らくサービスで起動しているプログラムAに設定してあるログオンユーザに


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

この回答への補足

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

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

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

ご迷惑をおかけしますが、何かよい解決策があればアドバイスお願いします。

補足日時:2002/02/14 21:15
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qネットワークの中のIPアドレスを一覧で表示は可能ですか

自分の作ったネットワークの中のIPを全部集めてきて一覧で表示できるコマンド、もしくはソフトウェアはないでしょうか?例えば100台のコンピューターが全てONでネットワークに接続している時、それらのコンピューターのIP、MACアドレスを集めて一覧で表示できないかなと思い質問させて頂きました。

Aベストアンサー

http://www.forest.impress.co.jp/lib/inet/servernt/netanlz/netenum.html

Q2 ~ 200 の素数 a, b, c (a < b < c) が、b - a = c - b を満たすa,b,cをビット操作を用いて求め、すべてを表示せよ

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&(1<<(i-1))&&(intval&(i+j-1))&&(intval&(1<<(i+2*j-1)))) print("%3d %3d %3d (%3d)\n",i,i+j,i+2*j,j);
}/*三つ子の素数を調べ出力

ちょっと考えてみました。でも、分かりません・・・まず、int型のintvalに200bitを割り当てて、intval=0としたいのですが、どうしたらいいのでしょう??
とりあえず考えてみたプログラムを誰か見て下さい!!お願いします。
#define BYTESIZE 200
#define MAX 200
main()
{
int i,j,intval=0;
for(i=2;i<=MAX/2;i++)
{
if(intval&(1<<(i-1)){}
else for(j=i*2;j<=MAX;j+=i)intval|=(1<<(j-1));
}/*素数を0、それ以外を1に
for(i=2;i<=MAX/2;i++)
for(j=2;j<=(MAX-i)/2;j++)
if((intval&...続きを読む

Aベストアンサー

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

第iビットを1にするときは
intval[i>>5]|=1<<(i&31);

とすれば良いでしょう。
関数やマクロを用意することをお勧めします。
例えば
int get(int intval[],int i)
{
return (intval[i>>5]>>(i&31))&1;/*0か1が返って来る。*/
}

void on(int intval[],int i)
{
intval[i>>5]|=1<<(i&31);
}

という感じです。

まずint型は200ビットもありません。通常は32ビットです。
200ビット使いたければint型を7個用意する必要があります。
つまり
int intval[7];
宣言して、
intval[0] 0~31ビット
intval[1] 32~63ビット
intval[2] 64~95ビット
.
.
.
intval[6] 182~200ビット
として使います。

第iビットの情報を取り出すときは
(intval[i>>5]>>(i&31))&1

...続きを読む

Qコマンドプロンプトを使ってネットワークの一覧を表示

コマンドプロンプトを使ってネットワークの一覧を表示する方法
LAN内のPCやプリンタ、ネットワーク機器のIPアドレスを
調べて一覧にするコマンドプロンプトのコマンドはありませんか?
固定IPかDHCPから割り振られたIPか、わかると更に嬉しいです。

なければそういった機能があるソフトでもいいので
ご紹介頂けると幸いです。

Aベストアンサー

こちら参考に
★lan内のpcをipアドレスで一覧表示したい | OKWave
http://oshiete.goo.ne.jp/qa/5829669.html

Qc#について質問があります。 a b c d など任意の文字を入れたら abcd とスペースを

c#について質問があります。
a b c d
など任意の文字を入れたら
abcd
とスペースをなくすプログラムを作成したいです。
任意の数字なので
string a=console.ReadLine()
とします。
この後から分かりません。
わかる方教えてください(´・_・`)

Aベストアンサー

No1の方の回答は、
a内のスペースを""(長さ0の文字列)に置き換える方法です。
この方法がシンプルでかつ速いため、実戦では、この方法を採用したほうが良いでしょう。
a内のスペースを取り除くことを自前で行うには、どうするかという観点で考えると、
以下のようになります。
----------------------------------
using System;
namespace goo
{
class Program
{
static void Main(string[] args)
{
Console.Write("文字列を入力してください:");
string a = Console.ReadLine();
string b = "";
int i;
for (i = 0; i < a.Length; i++)
{
if (a[i] != ' ')
{
b = b + a[i];
}
}
Console.WriteLine(b);
}
}
}
------------------------------------------------------
結果を格納する文字列として、bを用意しておき、
a内の空白でない文字をbへ加算していきます。
実行結果は以下のようになります。
文字列を入力してください:a b c h
abch

No1の方の回答は、
a内のスペースを""(長さ0の文字列)に置き換える方法です。
この方法がシンプルでかつ速いため、実戦では、この方法を採用したほうが良いでしょう。
a内のスペースを取り除くことを自前で行うには、どうするかという観点で考えると、
以下のようになります。
----------------------------------
using System;
namespace goo
{
class Program
{
static void Main(string[] args)
{
Console.Write("文字列を入力してください:");
string a = Console.ReadLine()...続きを読む

Qネットワーク内のIPアドレスを調べるには

早速ですが、同じネットワーク内で使われているIPアドレス全てを一覧表示する事の出来るコマンドがあったような気がするのですが、全く分からなくなりました。
分かる方回答をお願いします。

Aベストアンサー

WIN2kならipconfig
WIN9Xならwinipcfg

Qa[i]とa[i+1]を入れ替えるような関数を作成するC言語の問題

以下のように配列aとそのサイズsとインデックスiを引数
にとり、a[i]とa[i+1]を入れ替えるような関数を作成する問題。

但し、この関数内で配列の外側をアクセスしないようにエラー
チェックをすること。正常に処理が終了した場合は0を返し、
そうでない場合は-1を返すようにする。

main関数では、10個分の整数を入れる配列を宣言し、
データをユーザに入力させる。
次に、ユーザに1個整数を入力させ、0からその番号まで順に
iをずらしてswap_array関数を読んだ後、配列に入っているデータを
表示させる。

・配列にデータを入力でき、交換が正しくできている
・ユーザが配列の外側を指定した場合は、エラーである旨を
表示して終了する。

取りあえずこうゆうかんじになるのですが、//の前などをどうにすればいいか分かりません。分かる方は知恵を貸してください。

int swap_array(int a[], int s, int i)
{
//a[i]番目とa[i+1]番目を入れ替え処理をする

//正しく交換できた場合はreturn(0);
//エラーが発生した場合はreturn(-1);
}
int main()
{
//サイズ10の配列の宣言
int a[10];
//ユーザに10個のデータの入力をさせる
int i;
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
//0番目から何番目まで入れ替えるかユーザに聞く: (ユーザがnと入力)
int n;
......

//繰り返し構造を使って、0番目からn番目まで隣同士を交換
for(i=0;i<=n;i++){
int v;
// swap_arrayを繰り返し呼び出すが、毎回戻り値が0であることを
        //チェックしてエラーが発生していないことを確かめる
v=swap_array(a,10,i);

// エラーが発生していたら エラーが発生したことを表示して
//break;文で繰り返し構造から外にでる。
if(v==-1) break;
}

//エラーが発生しなかった場合に、入れ替えられた配列の内容を表示
if(v!=-1){
..... 配列の内容を表示
}

return(0);

以下のように配列aとそのサイズsとインデックスiを引数
にとり、a[i]とa[i+1]を入れ替えるような関数を作成する問題。

但し、この関数内で配列の外側をアクセスしないようにエラー
チェックをすること。正常に処理が終了した場合は0を返し、
そうでない場合は-1を返すようにする。

main関数では、10個分の整数を入れる配列を宣言し、
データをユーザに入力させる。
次に、ユーザに1個整数を入力させ、0からその番号まで順に
iをずらしてswap_array関数を読んだ後、配列に入っているデータを
...続きを読む

Aベストアンサー

こんな感じではだめでしょうか…。

#include <stdio.h>

unsigned int swap_array(int a[],unsigned int size,unsigned int s)
{
unsigned int temp,i=s;
if (size<s) return s;// 要素数を返す
while (i-1) temp=a[s-i+1],a[s-i+1]=a[s-i],a[s-i--]=temp;
return 0;
}
int main()
{
int a[10];
unsigned int n,i=0,size=sizeof(a)/sizeof(unsigned int);

do{
printf("%d個目のデータ?",i+1);
scanf("%d",&a[i]);
}while(++i<size);

//do{
printf("入れ替え対照、何番目のデータ(1~%d個)?",size);
scanf("%d",&n);
//}while(n>size || !n);
//この段階で範囲制限させる時は上記2行のコメントを解除

if (i=swap_array(a,size,n)) printf("エラー>要素数%dは範囲外です\r\n",i);
else for (i=0;i<size;i++) printf("%d個目:%d\r\n",i+1,a[i]);
return 0;
}

こんな感じではだめでしょうか…。

#include <stdio.h>

unsigned int swap_array(int a[],unsigned int size,unsigned int s)
{
unsigned int temp,i=s;
if (size<s) return s;// 要素数を返す
while (i-1) temp=a[s-i+1],a[s-i+1]=a[s-i],a[s-i--]=temp;
return 0;
}
int main()
{
int a[10];
unsigned int n,i=0,size=sizeof(a)/sizeof(unsigned int);

do{
printf("%d個目のデータ?",i+1);
scanf("%d",&a[i]);
}while(++i<size);

//do{
printf("入れ替え対照、何番目のデータ(1~%d個...続きを読む

Qネットワーク上の全ての固定IPのPC数とそのIPを知る方法

現在所属しているネットワーク上にある全ての固定IPのデバイス(PCなど)の数とそのIPアドレスを知る方法はありませんでしょうか?
固定IPアドレスにアクセスして、少しでもそのデバイスに関する情報も知る方法があればそれも教えていただきたいです。

例えば、ネットワーク上のネットワークプリンタがあり、そのプリンタは固定IPだがそのIPアドレスが何かわからないときなどに利用します。

Aベストアンサー

こんなフリーソフトがあります↓
http://www.forest.impress.co.jp/lib/inet/servernt/netanlz/netenum.html
うちの環境下では IP アドレス,コンピュータ名,MAC アドレス,ベンダー名,
所属(Workgroup)などが表示されましたが,ネットワークプリンタは発見
出来ませんでした.何か設定が悪いのかも知れません.

QC言語でCLAMP(a,b,c)

と書けばこの値はどのような値になるでしょうか?

Aベストアンサー

CLAMPはgmacros.hで定義されているマクロです。
詳細はgmacros.hを見ればわかると思います。

Qルータ同士のpingは、同ネットワークIPじゃないとダメ?

ルータ同士のpingは、同ネットワークIP上じゃないとダメ??

ネットワーク関連の問題・解答で、つまずいています。

ルータ1とルータ2がシリアルで直接接続されているとして、
お互いのpingが通らないトラブルになっているとします。
ルータ1のIPアドレスが10.1.1.1/24で、
ルータ2のIPアドレスが10.11.1.2/24
となっています。

原因はなぜでしょうか?
という問題です。

解答は、異なるネットワークのIPアドレスが設定されているから。
とあるのですが、いまいちピンときません。

プレフィックス長が24なので、第3オクテットまでネットワーク部なのはわかります。
ルータ1が10.1.1.0、ルータ2が10.11.1.0のネットワークで、異なっているのも分かります。

なぜ、ネットワークが異なると、pingが通らなくなってしまうのでしょうか。
ルータはそもそもセグメントを分割するわけですから、
異なっていていいんじゃないかとおもっているのですが、
ルータ同士のセグメントにおいては、同じでなければいけないのでしょうか?

         ↓ルータ1       ↓ホストB
□--------●-------○--------□
↑ホストA          ↑ルータ2

以上の様なルータにおけるIPアドレスは、
それぞれ2つもっており、ブロードキャストドメイン(=セグメント?)は3つあるとおもいます。

ホストA側のポートのIPと、ホストAのIPは同じネットワーク部を持たなければいけないのはわかります。
ルータ2に関しても。

でも、ルータ1とルータ2がなぜ同じネットワーク部を持たなければ、pingが通らないのでしょうか?
ルータは異なるIPアドレス、異なるネットワークIP同士の通信ができるものではないのでしょうか?

根本的に何か勘違いしているのだと思うのですが、どなたかご享受ください。

ルータ同士のpingは、同ネットワークIP上じゃないとダメ??

ネットワーク関連の問題・解答で、つまずいています。

ルータ1とルータ2がシリアルで直接接続されているとして、
お互いのpingが通らないトラブルになっているとします。
ルータ1のIPアドレスが10.1.1.1/24で、
ルータ2のIPアドレスが10.11.1.2/24
となっています。

原因はなぜでしょうか?
という問題です。

解答は、異なるネットワークのIPアドレスが設定されているから。
とあるのですが、いまいちピンときません。

プレフ...続きを読む

Aベストアンサー

>あるセグメントにおける通信では、同じネットワークIPでないと通信できない。

また混乱させてしまうとは思いますが、正確には「同一サブネット内の通信は、同じネットワークアドレスを持つノード同士でないとIP通信ができない」です。メディアレベルのブロードキャストは互いに受信できてしまいますから。

>これはルールとしてTCP/IPで定めていることなのでしょうか?

定めているといえば定めてますね。

>それとも物理的に不可能なのでしょうか?

よって、論理的に不可能、ということです。

またまた、混乱させることは本意ではないのですが・・・

実は、互いにデフォルトゲートウェイに自分のIPアドレスを設定すればIP通信はできてしまいます。このような抜け道的な方法を実装したメーカ(今は無きケーブルトロンとか、HPとか)もありました。L3と言っていましたが、L2.5と揶揄されたものです。このようなものは徒花のようなもので今はありませんから、気にする必要はありませんが。

QC言語 a * b / c の計算

特に困っているわけではないのですが、エレガントな方法が見つからないので質問します。

a,c は32ビット、bは8ビット、0<a≦c、0<b がわかっているとします。
このとき、8ビットの整数計算値 a * b / c を「最大32ビットの範囲」で計算する方法、教えてください。
一応C言語で考えていますので、以下の***の部分の具体的な計算方法がわかればうれしいです。

int a,c; // 32bit 符号付き整数
signed char b,d; // 8bit 符号付き整数
if(a<2^(32-8)) d = a * b /c;
else **** ← この部分のプログラム

Aベストアンサー

決してエレガントではありませんが、a, cは正でありしかし符号付の型だという前提で a * b / c の整数の商を求めるのであれば、最初にa - cを求めて一時変数に代入しておき、bの数だけループし、ループ中に一時変数にaを加え、それがc以上になったらdを1加えて一時変数からcを引き去ることを繰り返せば、間違いなくすべての数値は32ビット以内に収まると思います。CPUにALUしかない時代の発想で、歳がばれますね・・・


人気Q&Aランキング

おすすめ情報