ローカル→FireWall→ホストのFTPを実現するには?


ひよっこ  2005-10-25 19:55:28  No: 126881  IP: [192.*.*.*]

はじめまして。
WININETを使用してFTPモジュールを作成しているのですが、
FireWallの認証(IDとパスワード)を行ってからサーバに接続するには
どのような手続きが必要なのでしょうか?

自分が考えたのは

Sub Main()

Dim hInternet As Long
Dim hFtpSession As Long
Dim hSet As Long

hInternet = InternetOpen(Agent, _
                         INTERNET_OPEN_TYPE_PROXY, _
                         "FWサーバ名", _
                         vbnullstring, _
                         0)

hSet = InternetSetOption(hInternet, INTERNET_OPTION_PROXY_USERNAME, "FWユーザー名", Len("FWユーザー名"))
hSet = InternetSetOption(hInternet, INTERNET_OPTION_PROXY_PASSWORD, "FWパスワード", Len("FWパスワード"))

hFtpSession = InternetConnect(hInternet, _
                              "FWサーバ名", _
                              INTERNET_DEFAULT_FTP_PORT, _
                              "USER ユーザ名@ホスト名", _
                              "パスワード", _
                              INTERNET_SERVICE_FTP, _
                              0, _
                              0)

InternetCloseHandle(hFtpSession) 
InternetCloseHandle(hInternet) 

End Sub


このようなソースを書いたのですがうまくいきませんでした。
ちなみにInternetSetOptionのすぐあとに出力されたエラーコードは12018でした。
ハンドルがおかしいのかなと思ったのですが、戻り値は0なのでどうしてよいのかわからなくなりました。

API宣言は別モジュールで行っています。


ご助言お願いします。

編集 削除
我龍院忠太  2005-10-25 21:05:28  No: 126882  IP: [192.*.*.*]

今ちょっとかなり忙しいので詳しく見ていないが、
エラーは FormatMessageで書式化出来る、
ちなみに12018は
『要求された処理に対して、指定したハンドルの種類が正しくありません。』
でした、心当たりは?
ところで『vbnullstring』はなぜ『vbNullString』となってないの?
InternetOpenがおかしいのでは。

編集 削除
ひよっこ  2005-10-25 22:29:14  No: 126883  IP: [192.*.*.*]

コメントありがとうございます。

FireWallを経由しない場合をテストしたときは
正しく動作したので心当たりがない状況です・・。

ハンドルはInternetOpenで作成したハンドルではないのですか?

vbnullstringの件は、
もともとPublic Constで明示的にvbNullStringにしていたので、
わかりやすくするつもりでここで直接書き直しました。
混乱を招いてしまったのならごめんなさい。

編集 削除
我龍院忠太  2005-10-26 08:14:57  No: 126884  IP: [192.*.*.*]

これかな。
http://support.microsoft.com/?scid=kb;ja;324898&spid=2073&sid=154

編集 削除
ひよっこ  2005-10-26 08:34:49  No: 126885  IP: [192.*.*.*]

>これかな。
>http://support.microsoft.com/?scid=kb;ja;324898&spid=2073&sid=154

InternetQueryOption() は使っていないんですけど
なにか密接な関係があるのでしょか・・?

編集 削除
我龍院忠太  2005-10-26 09:48:37  No: 126886  IP: [192.*.*.*]

>InternetQueryOption() は使っていないんですけど
>なにか密接な関係があるのでしょか・・?
関係ないかも・・・orz
Len("FWユーザー名") -> Len("FWユーザー名") + 1
Len("FWパスワード") -> Len("FWパスワード") + 1
これでもだめですかね。

編集 削除
ひよっこ  2005-10-26 09:51:59  No: 126887  IP: [192.*.*.*]

>Len("FWユーザー名") -> Len("FWユーザー名") + 1
>Len("FWパスワード") -> Len("FWパスワード") + 1
>これでもだめですかね。

試してみましたが、だめでした・・・。
依然同じエラーコードが出ます。

編集 削除
もげ  2005-10-26 10:01:16  No: 126888  IP: [192.*.*.*]

ぱっと見...

F/W経由なら  InternetConnectのフラグに  
INTERNET_FLAG_PASSIVE  を追加する必要があるかも。

あと、
環境が書かれていないが、OSが何か?IEが5か6か?で違いはありますか?

"FWユーザー名", Len("FWユーザー名")
のところは、文字列終端がNull(0x00)でちゃんと終わっているのか?
それから、いわゆる全角文字がもしも含まれているのであれば、Lenじゃマズイよな。

という感じですが。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/setting_and_retrieving_internet_options.asphttp://support.microsoft.com/default.aspx?scid=kb;ja;175179
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200312/03120119.txt

編集 削除
ひよっこ  2005-10-26 10:11:19  No: 126889  IP: [192.*.*.*]

もげさんコメントありがとうございます。

すみません  OSはWindows2000 Service pack 4
IEのバージョンは6.0です

>"FWユーザー名", Len("FWユーザー名")
>のところは、文字列終端がNull(0x00)でちゃんと終わっているのか?
>それから、いわゆる全角文字がもしも含まれているのであれば、Lenじゃマズイよな。

全角は含まれていません。文字列終端がNullというのは、
仮にFWユーザ名が'user'の場合、Len("user")ではだめなのですか?
そこのなにかしらのヌルコードを含めるのですか?

編集 削除
ひよっこ  2005-10-26 10:50:26  No: 126890  IP: [192.*.*.*]

>F/W経由なら  InternetConnectのフラグに  
>INTERNET_FLAG_PASSIVE  を追加する必要があるかも。

追加したのですが、変化ありませんでした・・。

編集 削除
もげ  2005-10-26 13:22:18  No: 126891  IP: [192.*.*.*]

お使いのプロキシはCERNベースですか?
http://support.microsoft.com/?id=216214

編集 削除
ひよっこ  2005-10-26 13:40:55  No: 126892  IP: [192.*.*.*]

>お使いのプロキシはCERNベースですか?
CERNベースかどうかどこで判断すればよいでしょうか・・?

また
>http://support.microsoft.com/?id=216214
を閲覧してみたところ、InternetOpenUrlのハンドルを使用するらしいですが、
もし使うならURLは"ftp:〜"ではじまればよいですか?

編集 削除
もげ  2005-10-26 14:02:46  No: 126893  IP: [192.*.*.*]

>CERNベースかどうかどこで判断すればよいでしょうか・・?

システム管理者や、お使いのプロキシを提供しているメーカに聞いてみてください。
もしくは、使用しているF/W(プロキシ)の製品名を開示すれば、
経験者のコメントが得られるかもしれません。

編集 削除
ひよっこ  2005-10-26 14:42:08  No: 126894  IP: [192.*.*.*]

>http://support.microsoft.com/?id=216214
上記URLの一文で、
「ただし、 FTP プロトコルによる FTP サーバーにプロキシが次に接続します。 このファクトは、特定の FtpOpenFile や FtpPutFile などの WinInet FTP API を使用するのが不可能行います。」

という記述がありました。もし「CERNベース」だとファイルのアップロードができないような印象があります。
ですが(フリーソフトの)FFFTPを使ってFireWall経由での接続ができるので、
別の要因があるのではないかと思いました。

編集 削除
もげ  2005-10-26 16:11:20  No: 126895  IP: [192.*.*.*]

>「CERNベース」だとファイルのアップロードができないような印象があります。

そんなことはありません。
自動翻訳をそのまま読んでるからですかね。
こっちの図のほうが判りやすいかも。
http://support.microsoft.com/kb/166961/EN-US/

>(フリーソフトの)FFFTPを使ってFireWall経由での接続ができるので、
はいはい。その方向からアプローチするなら、ソースが公開されてるので、
それを参考にしてみるとか(Sota殿はwininetAPIは使ってないですね)。
http://www2.biglobe.ne.jp/~sota/ffftp.html

編集 削除
ひよっこ  2005-10-26 16:28:29  No: 126896  IP: [192.*.*.*]

>こっちの図のほうが判りやすいかも。

図を見て思ったのが、プロキシサーバにはHTTP通信するみたいなのですが、
それは目的のファイルがない場合でも可能なのでしょうか・・?

最終目的としてファイルのアップロードがしたいので、接続時には固定URLを使えないのかなと。

>はいはい。その方向からアプローチするなら、ソースが公開されてるので、
>それを参考にしてみるとか(Sota殿はwininetAPIは使ってないですね)。
参考にしたいのですがC言語はわからないしWinInetも使ってないので自分には理解できませんでした・・。

編集 削除