ネットワーク上のファイルにアクセスする際、IDとパスワードを入力させるには?

解決


デル太  2006-04-29 04:53:23  No: 21248

いつも、教えていただいています。ありがとうございます。
今回も、どうぞよろしくお願いします。

ネットワーク上の共有フォルダに保存したファイルにアクセスすることを考えいます。
次のようにやってみましたが、そのままではアクセス許可の問題でアクセスできません。

  Memo1.Lines.LoadFromFile('\\192.168.1.111\commonfolder\test.txt');

そこで、ネットワークコンピュータを開き、IPを指定します。
するとダイアログが表示され、そこで接続先マシンに登録したIDとパスワードで接続できます。・・・(A)
一度接続した後であれば、上記のコードでアクセスができるようです。

上記Aで表示されるOSのダイアログが自然に出てくれることを期待していたのですが、それを実現する方法があるのでしょうか?

または、このような場合、みなさんはどのように(接続先マシンの)IDとパスワードを入力して、接続なさっていますか?
どうぞ、教えてください。

環境として、クライアント/ネットワーク上の共有フォルダとも、Xpを使っています。
なお、コンピュータはドメインに参加せず、上記のように直接IPアドレスを指定したいと考えています。
よろしくお願いします。


kkk  2006-04-29 07:05:58  No: 21249

以前にも出てますが
https://www.petitmonte.com/bbs/answers?question_id=2922
Borlandのページは変更になっています
http://support.borland.com/entry.jspa?externalID=4335
リモートシャットダウンを参考にしてください


デル太  2006-04-29 18:52:16  No: 21250

kkkさん、ありがとうございます。
既出の内容だったのですね。ご紹介くださりありがとうございます。
上記2ページを見てみました。

ボーランドのページでは、特に「リモートログオン認証」のくだりが、図も含めて簡潔でとてもわかりやすいですね。
2番目にご紹介くださった既出スレッドも、具体的なコードが示されているので助かります。
ログオフはどうするのかな?と疑問を抱き始めていたところでした。その情報も含まれていますね。

2つの情報をもとに、これから、トライしてみます。
結果を別途報告いたします。


デル太  2006-04-29 20:05:54  No: 21251

次の関数を使って、リモートログオン認証ができました。(リモートログオフは、まだテストしていませんが)
kkkさん、ありがとうございます。

function LoginExecute(Host, UserName, Passwd: string): DWord;
var
  NetRes: TNetResource;
  str: String;
begin
  FillChar(NetRes, SizeOf(NetRes), 0); //何をやっているのだろう?
  NetRes.dwType := RESOURCETYPE_DISK;

  str := '\\' + Host + '\IPC$'; //IPC$とは何だろう?
  NetRes.lpRemoteName := PChar(str); //接続先ネットワークリソース名をセット

  //最終パラメータは、ネットワークリソースへの接続を記憶するフラグ→Nullの場合記憶しない
  Result := WNetAddConnection2(NetRes, PChar(Passwd), PChar(UserName), CONNECT_UPDATE_PROFILE);
end;

無事動作できたものの、いくつかわからないことが残ってしまいました。
よろしければ、どなたか教えてください。m(__)m

疑問1.次の行は何をやっていることになるのでしょうか?

  FillChar(NetRes, SizeOf(NetRes), 0); //何をやっているのだろう?

ボーランドのページ:C++でのコードでも同じ処理がされています。
コード的には、NetResをすべて0で埋めていることは理解できますが、その意味がわかりません。
このコードにより、どのような意味が出てくるのでしょうか?

疑問2.IPC$とは何なのでしょう?

  str := '\\' + Host + '\IPC$'; //IPC$とは何だろう?

ボーランドのホームページの説明から推測すると、マイクロソフトのネットワーク関連のものなのかな?

疑問3.ネットワークリソースへの接続を記憶しない方法は?

記憶するとログオン時に復元されますが、記憶させたくないときはどのようにすればよいでしょう?
Win32APIリファレンスを参照し、第4引数がNullだと記憶しないということで、次のコードにしてみました。

  Result := WNetAddConnection2(NetRes, PChar(Passwd), PChar(UserName), Null);

その結果、次のエラーが出てしまいました。

  バリアントの型変換が正しくありません

記憶させない場合、WNetAddConnection2の第4引数をどのように設定するのでしょうか?

以上、細かい内容で申し訳ありませんが、どうぞご指導お願いいたします。


kkk  2006-04-30 04:01:01  No: 21252

>疑問1.FillChar(NetRes, SizeOf(NetRes), 0); //何をやっているのだろう?
NetResの中をあらかじめ0クリアしておくことによって全ての値を記述しなくても良いようにするためです。(必要なものだけを設定する)

>疑問2.IPC$とは何なのでしょう?
こちらを参考にしてください
http://www.atmarkit.co.jp/fwin2k/win2ktips/117ipcpassword/117ipcpassword.html

>疑問3.ネットワークリソースへの接続を記憶しない方法は?
NULLではなく0を指定します。


デル太  2006-04-30 10:00:39  No: 21253

kkkさん、ご指導ありがとうございます。

疑問1について、
NetResは0クリアにより初期化できるんですね。分かりました。

疑問2について、
詳しい資料のご紹介、ありがとうございます。
まだちょっと混乱はありますが、具体的にコーディングを進める中で、少しずつ理解できてきたように思います。

疑問3について
0を指定して、エラーが出なくなりました。ありがとうございます。
Win32API呼び出しで引数をNullにする場合、Delphiでは0にするのでしょうね。

おかげさまで、かなり理解できるようになったと思います。
ただ、IPC$だとなぜかログオフができないような感じです。
(原因をうまくきりわけられないでいるのですが・・)

そこで、IPC$でなく、特定フォルダを指定してリモートログオン認証し、その指定したフォルダでログオフすると、うまく切断できるとか、そんなこともわかりました。
接続したままアプリケーションを終了すると、次に起動した際にもう一度同じユーザでリモートログオン認証をしてから一度ログオフしないと他のユーザでログオンできないようです。
そこで、アプリケーション終了時に、ログオンしたユーザとフォルダでログオフするようにしました。
これで、ある程度期待通りの動きをしてくれています。

それでも、一度リモートにログオンしてしまうと、それが保持されてしまうことがあり、クリアするためにクライアント側もログオフしてテストするなど、結構手数がかかります。
ローカルユーザは取得できるのですが、リモートにログオンしたユーザ名が今何なのか取得できないので、そんなことをしながら試行錯誤しています。
ネットワークを利用すると、テストなども含め、とたんに複雑になってしまうのですね・・。

そんなふうにはまっていたときに、kkkさんにまた貴重な情報をいただけました。
ほんとうにありがとうございました。


kkk  2006-04-30 11:44:54  No: 21254

少しだけ・・・
>Win32API呼び出しで引数をNullにする場合、Delphiでは0にするのでしょうね。
DelphiでのNullはバリアントで使用します。
CでのポインタのNULLはDelphiでは nil を使用します。
今回のWNetAddConnection2の第4引数は単にDWORDなので0を指定します。


デル太  2006-04-30 12:46:03  No: 21255

kkkさん、ご説明ありがとうございます。
型により違いがあること(私が誤解していたことも)がわかりました。
まだまだ理解は足りないと思いますが、使いながら徐々にわかってくると考えようと思います。
これからもよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加