tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルMSXML2.XMLHTTP60 をログオフ状態で使用
記事No16149
投稿日: 2015/07/13(Mon) 16:34
投稿者でふぁいあんと
お世話になります。
相手先サーバーの指定によりxml通信が通信が
必要になり、プログラムを組んでみました
一部--
Dim objXML As New MSXML2.XMLHTTP60
objXML.open "POST", [指定URL] & "?" & [GETデータ], True
objXML.setRequestHeader "Host", "hogehoge.jp"
objXML.setRequestHeader "Content-Type", "multipart/form-data; boundary=---------------------------" & strBoundary
objXML.setRequestHeader "Authorization", "hogehoge"
objXML.send [送信データ]
[objXML.readyState = 4 まで待ち]
strStatus = objXML.Status

その他データ部分は省略していますが、
この状態で、send.exeとコンパイルして
コマンドラインから実行すると、データの送信はできています

そこでデータ送信を定期的に行いたいので
タスクスケジューラにこのsend.exeを登録します
ユーザーログオン状態、スケジューラー設定 [ユーザーがログオンしているときのみ]にチェック
この設定の時のみxmlステータスが200になり定期的に正常送信できます
ユーザーがログオンしていない、またはスケジューラ設定が、「ログオンしているかにかかわらず」
では、実行はするのですが、
xmlステータスの結果が0となり、データの送信ができません。
MSXML2.XMLHTTP60 はログオン状態でないと作動しないのでしょうか

もしこれが仕様なら、他のxml送信オブジェクトは何かご存じないでしょうか

[ツリー表示へ]
タイトルRe: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16150
投稿日: 2015/07/13(Mon) 18:50
投稿者魔界の仮面弁士
> MSXML2.XMLHTTP60 はログオン状態でないと作動しないのでしょうか

無人実行が目的の場合は、XMLHTTP ではなく
ServerXMLHTTP を使ってみてください。

ほぼ同じようなプロパティとメソッドを備えますが、
細かいところで違いがあるのでご注意ください。


> もしこれが仕様なら、他のxml送信オブジェクトは何かご存じないでしょうか

サービス向けのライブラリとしては、WinHTTP という物もあります。
こちらも併せて試してみてください。

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16151
投稿日: 2015/07/14(Tue) 14:05
投稿者でふぁいあんと
魔界の仮面弁士様 お返事ありがとうございます
> 無人実行が目的の場合は、XMLHTTP ではなく
> ServerXMLHTTP を使ってみてください。
さっそく以下のようにしました
プログラム部分は同じです
Dim objXML As New MSXML2.ServerXMLHTTP60
objXML.open "POST", [指定URL] & "?" & [GETデータ], True
objXML.setRequestHeader "Host", "hogehoge.jp"
objXML.setRequestHeader "Content-Type", "multipart/form-data; boundary=---------------------------" & [Boundary文字]
objXML.setRequestHeader "Authorization", "hogehoge"
objXML.send [送信データ]
[objXML.readyState = 4 まで待ち]

ここで、readystate がずっと1のままで、4になりません。
また、fiddler(httpプロクシ)を使ってみると
fiddler自身に表示されないので、sendがうまくいってないのでしょうか
serverXMLHTTP60に特有のなにかがあるのでしょうか

[ツリー表示へ]
タイトルRe^3: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16152
投稿日: 2015/07/14(Tue) 15:48
投稿者魔界の仮面弁士
> プログラム部分は同じです
現在はスケジューラーに登録せず、直接起動でテストしている状況なのでしょうか。


> また、fiddler(httpプロクシ)を使ってみると
Inet API ベースのライブラリである XMLHTTP と、
WinHTTP ベースのライブラリである ServerXMLHTTP とでは、プロキシの設定方法が異なります。

ServerXMLHTTP の場合は、Proxycfg コマンドもしくは netsh winhttp コマンドを用いて
設定するか、あるいはコードから setProxy メソッドを用いて設定することになります。


> [objXML.readyState = 4 まで待ち]
この待機は、どのように行っていますか?


> ここで、readystate がずっと1のままで、4になりません。
非同期モードを採用しているのは、意図的なものでしょうか?
特に理由が無ければ、open メソッドの第三引数を False に変更し、
同期モードでの実行に切り替えてみて下さい。通信が完了するまでは
send が戻ってこなくなるため、readyState の判定を行う必要がなくなります。
(タイムアウト設定が必要なら、setTimeouts メソッドを併用します)


もし、どうしても非同期モードで通信するのであれば、処理のために
メッセージポンプが必要となります(ちなみに XMLHTTP でも必要です)。

すなわち、ServerXMLHTP を非同期モードで待機させる場合には、
 案1) ReadyState のポーリング監視中に、waitForResponse メソッドを呼び出してメッセージポンプを回す。
 案2) フォームに Timer を貼り、Tiemr イベントで ReadyState プロパティを定期的にチェックする。
 案3) onreadystatechange プロパティに、コールバックオブジェクトをセットして通知してもらう。
の何れかが必要だということです。


第3案に書いたのコールバックオブジェクトとは、自作のクラスモジュールのことです。
作成手順としてはこんな感じ。
 (1) Class モジュールを作成。たとえば ReadyStateHandler.cls として。
 (2) そこに「Public Sub OnReadyStateChange()」という引数無しのメソッドを作成。
 (3) そのメソッドに対し、[ツール]-[プロシージャ属性] 画面から、
   [詳細]-[プロシージャID]欄に「(既定値)」をセットする。
 (4) 呼び出し側では、
    Set objHandler = New ReadyStateHandler
    Set objXML.onreadystatechange = objHandler をセットしておく。

登録に成功すれば、readyState が変化するたびに (2)のメソッドが
イベントのように呼び出されるので、そこで readyState を判断する形です。

[ツリー表示へ]
タイトルRe^4: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16153
投稿日: 2015/07/14(Tue) 17:46
投稿者でふぁいあんと
いつもご丁寧にありがとうございます
> 現在はスケジューラーに登録せず、直接起動でテストしている状況なのでしょうか。
はい、単体テストの段階です。

> ServerXMLHTTP の場合は、Proxycfg コマンドもしくは netsh winhttp コマンドを用いて
> 設定するか、あるいはコードから setProxy メソッドを用いて設定することになります。
すみません。これ忘れていました


> > ここで、readystate がずっと1のままで、4になりません。
> 非同期モードを採用しているのは、意図的なものでしょうか?
特に意味はありません
> 特に理由が無ければ、open メソッドの第三引数を False に変更し、
> 同期モードでの実行に切り替えてみて下さい。通信が完了するまでは
falseにて、実行したところ

sendのところで
「エラー -2146893019
信頼されてない機関によって証明書チェーンが発行されました」
という状態です。

相手先指定URLは、httpsなのですが、
sslの関係でしょうか

[ツリー表示へ]
タイトルRe^5: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16154
投稿日: 2015/07/14(Tue) 19:37
投稿者魔界の仮面弁士
> sendのところで
> 「エラー -2146893019
> 信頼されてない機関によって証明書チェーンが発行されました」
> という状態です。

中間CA証明書(あるいはルート証明書)がチェーン上に見つかりましたが、
その発行機関が「信頼されていない」状態ですね。
いわゆる「オレオレ証明書」というヤツではないでしょうか。
https://msdn.microsoft.com/ja-jp/library/ff723917.aspx
http://d.hatena.ne.jp/keyword/%A5%AA%A5%EC%A5%AA%A5%EC%BE%DA%CC%C0%BD%F1


> 相手先指定URLは、httpsなのですが、
その URL は掲示板に公開可能ですか?


> sslの関係でしょうか
証明書の内容に不備があると思いますので、
そのサイトのサーバー管理者に問い合わせてみてください。

[ツリー表示へ]
タイトルRe^6: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16155
投稿日: 2015/07/15(Wed) 15:11
投稿者でふぁいあんと
> > 相手先指定URLは、httpsなのですが、
> その URL は掲示板に公開可能ですか?
yahooでサービスされているURLですが
今回のURLは契約ベースでやりとりしているところなので
公開は控えます

> > sslの関係でしょうか
> 証明書の内容に不備があると思いますので、
> そのサイトのサーバー管理者に問い合わせてみてください。
おそらくは無視されるかなと思います(笑)

ssl警告を無視するという点では
objXML.setOption _
             SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
             SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
この辺があやしいのかなと思いましたが、だめでした。

特にserverXMLHTTPにこだわっていませんが
winHTTPでも同じエラーでした

[ツリー表示へ]
タイトルRe^7: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16156
投稿日: 2015/07/15(Wed) 22:23
投稿者魔界の仮面弁士
> 証明書の内容に不備があると思いますので、

なお、証明書の内容については、以下のサイトで確認できます。
https://ssltools.websecurity.symantec.com/checker/views/certCheck.jsp
https://ssltools.geotrust.com/checker/views/certCheck.jsp
https://ssltools.thawte.com/checker/views/certCheck.jsp


たとえば、信頼されていない中間CA証明書が使われているなら、
 (対策案A1) クライアント側で、その証明書を信頼する
 (対策案A2) サーバー側で、信頼された証明書に差し替える(または正しい証明書の環境を別途用意する)
といった対処が必要でしょうし、あるいはクライアントの環境が古く、ルート証明書が不足している場合には、
 (対策案B1) クライアント側に、信頼されたルート CA 証明書を展開する
 (対策案B2) サーバー側にて、クロスルート証明書を導入する
などが必要です。他のパターンもあるでしょうけど。


前者は、Fiddler プロキシを噛ませている場合や、自己証明書(makecert.exe 製など)が
使われている場合に発生する可能性があります。kotonet.com などが自己証明書ですね。


後者は、最近の OS からアクセスする場合には問題となりませんが、
XP Embedded や古い携帯電話から接続される場合には、対処が必要になってきます。
mixi.jp などは B2案で処理されていますね。


特に今回の場合、ログオン中の XMLHTTP では通信できているようなので、
 (1) [ファイル名を指定して実行]で "mmc" を起動
 (2) [ファイル]-[スナップインの追加と削除] で、「証明書」を追加
として、インストール済みのルート証明書および中間証明書を調べてみるのも良いかもしれません。

現在の『ユーザーアカウント』に対しては、中間CAが信頼されているかもしれませんが、
スケジューラーに対しては、信頼されていない可能性もあるためです。

信頼されていないようなら、サーバー側 or クライアント側の設定を見直して、
証明書チェーンが信頼できるような状況に持っていくか、もしくは、
信頼されていないものを無視して通信するかを選ぶことになるでしょう。



> おそらくは無視されるかなと思います(笑)

Yahoo! のどのサービスか分かりませんが、法人サポートの窓口サービスのようなものが
ないのだとすれば、Yahoo!デベロッパーネットワークの開発者コミュニティを
利用するぐらいしか無いのかも知れませんね。

とはいえ、問い合わせる事が適切かどうかまでは、こちらでは判断出来ません。
(何が問題になっているのか判断するには、現時点では情報が不足しすぎています)

問題箇所さえ明確になれば、その回避方法の提案もできるかも知れませんが、
掲示板で公開できる情報がこれ以上無いのだとすれば、現状で問題点を
正確に把握できるのは、実際にその場にいるでふぁいあんとさん自身か、
もしくはサービスを提供している業者ということになってしまいます。

ですから、ご自身で問題箇所を特定できそうにないのであれば、
>> そのサイトのサーバー管理者に問い合わせてみてください。
と提案した次第です。(提供者側が回答できる内容なのかどうかは、また別の話)

それでも解決できないようであれば、Microsoft の有償サポートを利用するなど、
より詳しい人(かつ、秘密保持の義務を果たせる人)に頼る必要があるかもしれません。


> 特にserverXMLHTTPにこだわっていませんが
> winHTTPでも同じエラーでした
ServerXMLHTTP は WinHTTP ベースのライブラリですしね。


> ssl警告を無視するという点では
> objXML.setOption _
>              SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS, _
>              SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
> この辺があやしいのかなと思いましたが、だめでした。
ふぅむ。
エラー内容からすると、SXH_SERVER_CERT_IGNORE_UNKNOWN_CA あたりだと予想しましたが、
SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS はそれらを統括するはずなんですよね…。

[ツリー表示へ]
タイトル削除
記事No16157
投稿日: 2015/07/16(Thu) 15:40
投稿者でふぁいあんと
削除

[ツリー表示へ]
タイトルRe^8: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16158
投稿日: 2015/07/16(Thu) 15:43
投稿者でふぁいあんと
魔界の仮面弁士様 大変お世話になります。
ツリーの位置を間違えましたがこのままぶらさげます。

「信頼されていないものを無視して通信するかを選ぶことになるでしょう。」
単純にこれを実現したいのですが、何かヒントはないでしょうか
「エラー内容からすると、SXH_SERVER_CERT_IGNORE_UNKNOWN_CA あたりだと予想しましたが、
SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS はそれらを統括するはずなんですよね…。」
特に上記のご説明です。


もうひとつ、違う方法になりますが、新たに分かったことです。
投稿最初の xmlhttp60を使ったプログラムですが
スケジューラ登録で、
vb6 /runexit このプロジェクト.vbp にて、デザインモードからの実行にすると
ログオフ状態でも処理できることがわかりました。
とりあえずこの方法で凌いでいますが
xmlhttpの扱いについてexeとvbpは何か違うのでしょうか

[ツリー表示へ]
タイトルRe^9: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16159
投稿日: 2015/07/16(Thu) 17:33
投稿者魔界の仮面弁士
MMC の証明書スナップインで、「ローカル アカウント」で保持されている証明書と、
「コンピュータ アカウント」あるいは「(スケジューラーの)サービス アカウント」の証明書を
比較してみて下さい。目的のサイトの証明書のチェーンが、ローカル アカウントの場合にのみ
信頼済みルートに繋がっていて、他のアカウントでは繋がっていないような状況であれば、
今回の問題が発生するかもしれません。


それと、スケジューラー上での無人実行を必要とするのであれば、
プロジェクトのプロパティの[対話型インターフェイスの抑制]を
on にしておくことをお奨めします。(App.UnattendedApp = True の状態)

これを設定しておけば、トラップされていないエラーが発生した場合でも、
メッセージボックスでの表示ではなく、イベントログへの記録に置き換わります。
(無人実行であるがゆえに、Form を使うことはできなくなります)



> 「信頼されていないものを無視して通信するかを選ぶことになるでしょう。」
> 単純にこれを実現したいのですが、何かヒントはないでしょうか

スケジューラー上での実行は試していないのですが、当方では
setOption 自体は動作しているように見えます。


同じエラーを発生させるようなテスト環境が無いので、
具体的なところはお手伝いできそうにありませんが…。

Option Explicit

Private Sub Command1_Click()
    Dim url As String
    
    '[80072F05] 証明書の日付は無効か有効期限が切れています
    'チェーン上のクロスルート証明書は正しく配置されているが
    '肝心のサーバー証明書が期限切れを迎えているパターン
    url = "https://www.bugin.cns-jp.com/"
    url = "https://www.hokuetsu.cns-jp.com/"
    
    '[80072F0D] この証明機関は、無効か正しくありません
    '有効期限が過ぎているのみならず、
    '別サイトである www.kotonet.com 向けの証明書が
    'kotonet.com で使われており、証明にならないパターン
    url = "https://kotonet.com/"

    '[80072F0D] この証明機関は、無効か正しくありません
    '証明書自体は有効期限内ではあるのだが、
    '別サイトである www.sdc-sample.net 向けの証明書が
    'www.hokuetsu.cns-jp.com で使われている上に、
    'チェーン上にルート証明書を検出できないパターン
    url = "https://www.musashinobank.co.jp/"
    
    '[80072F0D] この証明機関は、無効か正しくありません
    '証明書そのものは正しい内容であるが、
    'ルート証明書がサーバー上に配置されている状況で、かつ、
    'クライアントの信頼済みストアには存在していないため
    '証明書を信頼することができないパターン
    url = "https://www.cii.u-fukui.ac.jp/"
    
    Dim o As Object
    Set o = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    o.open "HEAD", url, False
    If Check1.Value = vbChecked Then
        o.setOption 2&, 13056&
    End If
    o.send
    MsgBox o.getAllResponseHeaders()
End Sub


> xmlhttpの扱いについてexeとvbpは何か違うのでしょうか
思いつく範囲では:

・作成した EXE あるいは VB6.EXE のプロパティに、互換モードを指定してはいないか?
・コンパイルオプションは P-Code か? それともネイティブか? (開発環境は P-Code 相当)
・実行時のカレントディレクトリは同一になっているか? (依存コンポーネントの相対パスの問題)

[ツリー表示へ]
タイトルRe^10: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16160
投稿日: 2015/07/17(Fri) 14:51
投稿者でふぁいあんと
ServerXMLHTTP60 側のお話ですが、
こちらは、ログオン状態でもエラーになるので
この話をさせてください。

> スケジューラー上での実行は試していないのですが、当方では
> setOption 自体は動作しているように見えます。

参考例のプログラムありがとうございました。
o.setOption 2&, 13056&は
当方の環境でも無事動作します。

問題となっているURLは特に限定公開されているわけでもないので
公開してもいいのかなと判断します
そのURLの一例は yahooデベロッパーAPIのうちのひとつ
hhttps://circus.shopping.yahooapis.jp/ShoppingWebService/V1/reservePublish
です。
ここに適正なパラメータを送信すると、結果がxmlで返ってくる仕組みですが
パラメーター無しでもエラーは再現できました
o.Open "POST", strAPIURL↑, False
o.Send "dummy"
を実行すると
「[80090325] 信頼されていない機関によって証明書
'チェーンが発行されました」
です。

ちなみにこのapiのテスト用API
hhttps://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/reservePublish
とか
オークション用の
hhttps://auctions.yahooapis.jp/AuctionWebService/V2/openWatchList
については、
o.sendではエラーにならず
その後、o.statusで、エラー番号を受信できます。

質問すべき場所が違うのは理解しておりますが
vbのことなので、先方の回答が期待できないのです
なにとぞよろしくお願いします

[ツリー表示へ]
タイトルRe^11: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16161
投稿日: 2015/07/17(Fri) 16:52
投稿者魔界の仮面弁士
URL の提供ありがとうございます。こちらでも再現できました。

setOption が効かないのも不自然ですので、とりあえず今回は、
Yahoo! 側ではなく、Microsoft の有償サポートに問い合わせてみます。

調査までに日数がかかると思いますが、期待せずにお待ちください。
(本日時点ではサポート未契約のため、問い合わせ開始は来週からになります)

[ツリー表示へ]
タイトルRe^12: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16162
投稿日: 2015/07/22(Wed) 14:41
投稿者魔界の仮面弁士
> setOption が効かないのも不自然ですので、とりあえず今回は、
> Yahoo! 側ではなく、Microsoft の有償サポートに問い合わせてみます。

Microsoft サポートへの問い合わせを開始いたしました。

でふぁいあんとさんが具体的な URL を示して下さったおかげで、
スムーズに問い合わせが進みました。(情報提供ありがとうございます)


何か進展が得られれば、こちらの掲示板にもフィードバックさせて頂きますが、
現在は暫定対策で凌いでおられるとのことでしたので、今回は緊急性の低い
深刻度 C として伝えております。

(情報提供までに何日も何週も待てないという場合は、
 ご自身にて問い合わせを行うことも検討してみてください)

[ツリー表示へ]
タイトルRe^13: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16163
投稿日: 2015/07/22(Wed) 15:46
投稿者でふぁいあんと
魔界の弁士さま、いろいろありがとうございます。
ここしか頼るところがないので
何日でも待ちます。

暫定対策というのは、
vb6.exe /runexit プロジェクトファイル起動
で動いています。
今のところ、プロセスに残ったりしてませんが
何か予想できる問題ってありますか

[ツリー表示へ]
タイトルRe: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16164
投稿日: 2015/07/22(Wed) 18:15
投稿者魔界の仮面弁士
階層が深くなってきたので接ぎなおします。


問い合わせ回答はまだ来ていませんが:


https://support.microsoft.com/ja-jp/kb/301429
を見る限り、ServerXMLHTTP のバージョンによって、
参照する証明書ストアに差異があるようです。


証明書の問題を回避できない場合、send メソッド自体が失敗し、
readyState プロパティも更新されない状況になるはずです。
ですから、ServerXMLHTTP の通信が失敗するという件と、
非ログオン時に XMLHTTP の処理が進まないという件は、
根っこの部分では同じなのかも知れません。


一応、非ログオンでのタスク実行では無くデスクトップでの実行ですが、
他のライブラリで検証してみた限りでは、
WinHttp.WinHttpRequest や ServerXMLHTTP では失敗しますが、
「VB6 の Inet コントロール」や「XMLHTTP」、あるいは .NET の
「System.Net.HttpWebRequest クラス」では通信できている感じです。

YCA AppID が無いとのことで、[401 Authorization Required] にはなりますけれどね。


VB6 に拘りが無ければ、PowerShell / VB.NET / C# などから
HttpWebRequest を呼び出す実装に置き換えるのはどうでしょう。
それで無人実行できるかどうかは別問題ですけれども…。


なお、Fiddler 経由で該当 URL にアクセスしたところ、初回通信時に
》 The server [circus.shopping.yahooapis.jp] requests a client certificate.
と表示されました。何か心当たりはありますか?



> 暫定対策というのは、
> vb6.exe /runexit プロジェクトファイル起動
> で動いています。

WinHTTP API 系(ServerXMLHTTP)ではなく、Inet API 系(XMLHTTP)を用いた場合の話ですね。
コンパイルモード(ネイティブコンパイル or P-Code コンパイル)を変更した場合、
動作に変化はありますか?


> 今のところ、プロセスに残ったりしてませんが
> 何か予想できる問題ってありますか

・実行時ライセンス(ランタイム)ではなく、開発時ライセンス(デザインタイム)が必要になってしまう
・開発環境のサポートは既に終了している(ランタイムについては、 OS のサポート期限に準じる)
・VB6.EXE や XMLHTTP は対話型なので、本来は無人実行には向いていない
 (たとえば、エラー発生時にメッセージボックスが起動される可能性がある)

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16165
投稿日: 2015/07/23(Thu) 15:20
投稿者でふぁいあんと
引き続きお世話になります

> 階層が深くなってきたので接ぎなおします。
はい
ご回答いただいた部分はじっくり考えて見ます

特に
> VB6 に拘りが無ければ、PowerShell / VB.NET / C# などから
> HttpWebRequest を呼び出す実装に置き換えるのはどうでしょう。
> それで無人実行できるかどうかは別問題ですけれども…。
一旦、vb.netに乗換えを考えていましたが、
toStringで挫折しました(笑)
言後乗り換えるなら,C#かなと思っていますが、、いまさらwin環境にこだわる必要も
ないのかなと、迷っていて、結局vbaあるしvb6でいいかという状態です。
vbaはまだ正式サポートですよね。vbaで実行することに意味ありますか


> なお、Fiddler 経由で該当 URL にアクセスしたところ、初回通信時に
> 》 The server [circus.shopping.yahooapis.jp] requests a client certificate.
> と表示されました。何か心当たりはありますか?
実際には、リクエストヘッダに、 アクセストークンなる認証コードを入れないと
いけないので、そのチェックだと思います。

> WinHTTP API 系(ServerXMLHTTP)ではなく、Inet API 系(XMLHTTP)を用いた場合の話ですね。
> コンパイルモード(ネイティブコンパイル or P-Code コンパイル)を変更した場合、
> 動作に変化はありますか?
今、確認しましたが、pcode,ネィティブコンパイル(最適化無し),ネイティブコンパイル(サイズ最適化)
とも、同じですね、ログオフ時の実行に、xmlstatus=0です。

あと申し訳ないですが、コードを見てにお伝えしてなかったことに気がつきました
xmlhttp60を使っている前提です。
(1)実は、xmlHTTPでも、最初に xmlhttp.send [postデータ]とすると
xml.status=0になります
試行錯誤した結果、最初はわざとxmlhttp.send "" として、null送信してから
xml.status = 400 を取得
改めて xmlhttp.send [postデータ]とすると、xml.status=200 となって
プログラム的には正常作動するのです。なぜなのかな?

(2)スケジューラーで「ユーザーがログオンしているかどうかにかかわらず実行する」
にチェックすると、ログオンしていてもxmlStatus=0になります。

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16166
投稿日: 2015/07/29(Wed) 17:57
投稿者魔界の仮面弁士
> 問い合わせ回答はまだ来ていませんが:

調査結果が送られてきました。

それによると、恐らくはアクセス先のサーバーがクライアント証明書を求めており、
それに対して渡す証明書が適切ではないためにエラーとなっているのだろう、とのことです。


そしてこれは、先の No16164 で私が見たメッセージとも符合するように思えます。
Fiddler ゆえの事情もあるでしょうから、確信はもてませんけれどね。

> なお、Fiddler 経由で該当 URL にアクセスしたところ、初回通信時に
> 》 The server [circus.shopping.yahooapis.jp] requests a client certificate.
> と表示されました。何か心当たりはありますか?



そして、今回利用していた
 Call objServerXmlHttp.setOption(2, 13056)
  'SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS
  'SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS
という指定は、あくまでも「サーバー証明書のエラーを無視するもの」です。

しかし、サーバーがクライアントに証明書の提供を求めてきた場合、既定では
『ローカルストアで最初に見つかった証明書』をサーバーに渡すのだそうです。
ゆえに、その証明書が適切でない場合には、エラーになってしまうのでしょう。


サポートから回答頂いた対策は 2 つ。

1 つは、サーバー設定を見直して、クライアントに証明書を求めないように構成してもらうことです。
少なくとも他の URL では問題なく通信できているわけですから、circus.shopping.yahooapis.jp も
同じように設定できると思います。設定してもらえるかどうかは別として。

もう 1 つの策は、クライアントに適切な証明書をインストールし、ServerXMLHTTP の
SXH_OPTION_SELECT_CLIENT_SSL_CERT オプションを使ってその証明書の名前を指定することです。

https://msdn.microsoft.com/en-us/library/ms753798.aspx
https://msdn.microsoft.com/en-us/library/ms763811.aspx

Yahoo 側の対応を考えれば、恐らくは後者の対応になると思いますが、
具体的にどうするべきかは当方には答えられません。
(当方には、Yahoo API についての利用経験や情報が無いので…)


とりあえず以下に、「クライアント証明書」という用語で検索に引っかかってきたサイトを
紹介しておきます。関連するかどうかは分かりませんが、一応参考までに。
https://support.microsoft.com/ja-jp/kb/301429
http://dsas.blog.klab.org/archives/51254911.html

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16167
投稿日: 2015/07/30(Thu) 17:24
投稿者魔界の仮面弁士
追記:

> サポートから回答頂いた対策は 2 つ。

前者案は現実的ではないでしょうね…。

また後者案も、そもそも本当にクライアント証明書が必要だとは
思えなかったため、本件に関してはサポートに継続調査を依頼しています。


SSL 通信かつ第三者のサーバーであることから、調査そのものも
難航しているようですが、調査範囲を MSXML だけに絞るのではなく、
それ以外の範囲(Inet や WinHTTP など)にも広げてもらい、
何か提供できる情報が無いかどうかを調べてもらっています。


調査結果(あるいは進展の有無)の報告スパンを数日おきにしてもらっていますので、
私がこちらにフィードバックする間隔は、それ以上に長くなると思います。

最終的に解決策が見つかるかどうかは保証できませんが、
引き続き、期待せずにお待ちください。

---


≫ No.16163
> vb6.exe /runexit プロジェクトファイル起動
> で動いています。
> 今のところ、プロセスに残ったりしてませんが
> 何か予想できる問題ってありますか

その方法は、私ならできれば避けたいですね…。理由は 2 つ。

VB6.exe は対話モードを前提としたものなので、非ログオン状態での
動作が保証されているわけでは無いという点と、実行に当たって、
実行環境に、開発者ライセンスが必要となるという点ですね。


ところで、VB6 のかわりにVBScript を使うのはどうでしょうか。
WSH なら、コマンドラインオプションで、
//I (インタラクティブ:対話あり) と
//B (バッチ:対話が必要な入出力が無効)
を切り替えられますよ。通信の成否までは試していませんけど…。


≫ No.16165
> 一旦、vb.netに乗換えを考えていましたが、
> toStringで挫折しました(笑)

VB.NET や C# のオブジェクトに、toString メソッドはありません。でも ToString ならあります。
一方、JScript.NET の場合は、toString も ToString も両方あります(別の機能です)。


> vbaはまだ正式サポートですよね。vbaで実行することに意味ありますか
今回の目的は「ログオフ状態で使用」だったはずなので、採用できないと思いますよ。
少なくとも私は、非対話型に対応した VBA 搭載製品を見たことがありません。

VB6 の場合は、[プロジェクトのプロパティ]-[全般]-[対話型インターフェイスの抑制]を
指定することで、非ログオン状態に対応したアプリケーションになりますけれどね…。



> (1)実は、xmlHTTPでも、最初に xmlhttp.send [postデータ]とすると
> xml.status=0になります
・post データは文字列ですか? バイナリですか? その時のデータサイズは?
・非同期モードですか? 同期モードですか?
・send メソッド呼び出し時に、実行時エラーは発生しますか?
・readyState は 1 のままですか?


> 最初はわざとxmlhttp.send "" として、null送信してから
> xml.status = 400 を取得
上記の xmlhttp と xml は、同じオブジェクトなのでしょうか?


> 改めて xmlhttp.send [postデータ]とすると、xml.status=200 となって
> プログラム的には正常作動するのです。なぜなのかな?

おそらくはセッション cookie を食べたのだと思います。
初回と2回目とで、リクエストヘッダー/レスポンスヘッダーの内容を確認してみてください。
http://winofsql.jp/VA003334/infoboard.php?mid=sh_web&id=100618110711&pid=1

[ツリー表示へ]
タイトルRe^3: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16168
投稿日: 2015/07/31(Fri) 16:27
投稿者でふぁいあんと
魔界の仮面弁士 大変お世話になっております。
いろいろご尽力いただき誠に感謝しております。



> 前者案は現実的ではないでしょうね…。
はい
> また後者案も、そもそも本当にクライアント証明書が必要だとは
> 思えなかったため、
はい、クライアント証明書の入手先もわからないので、、、

> 最終的に解決策が見つかるかどうかは保証できませんが、
> 引き続き、期待せずにお待ちください。
期待しつつ、気長にまっています。
いろいろとよろしくお願いします。

> ところで、VB6 のかわりにVBScript を使うのはどうでしょうか。
> WSH なら、コマンドラインオプションで、
> //I (インタラクティブ:対話あり) と
> //B (バッチ:対話が必要な入出力が無効)
> を切り替えられますよ。通信の成否までは試していませんけど…。
前回、PowerShellとVBScriptについてお聞きしたので
こちらのアプローチも試して見ます。

> 今回の目的は「ログオフ状態で使用」だったはずなので、採用できないと思いますよ。
そうですね。おっしゃるとおりです。


> > (1)実は、xmlHTTPでも、最初に xmlhttp.send [postデータ]とすると
> > xml.status=0になります
> ・post データは文字列ですか? バイナリですか? その時のデータサイズは?
文字列でも、バイナリ(バイト型可変長)でも同じ状況です。
また、数文字から、5mバイト(zipファイル)まで扱うことが
ありますが、特に内容によって挙動がかわるということはないようです。

> ・非同期モードですか? 同期モードですか?
同期モードです。
> ・send メソッド呼び出し時に、実行時エラーは発生しますか?
発生しません。
> ・readyState は 1 のままですか?
4ですね。

>
> > 最初はわざとxmlhttp.send "" として、null送信してから
> > xml.status = 400 を取得
> 上記の xmlhttp と xml は、同じオブジェクトなのでしょうか?
省略してすみません。同じオブジェクトです。

>
> おそらくはセッション cookie を食べたのだと思います。
> 初回と2回目とで、リクエストヘッダー/レスポンスヘッダーの内容を確認してみてください。
> http://winofsql.jp/VA003334/infoboard.php?mid=sh_web&id=100618110711&pid=1
はい、これは今から調べてみます

[ツリー表示へ]
タイトルRe^4: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16169
投稿日: 2015/08/04(Tue) 17:57
投稿者魔界の仮面弁士
サーバー側からクライアント証明書が要求されてきた場合、
ServerXMLHTTP では、その振る舞いを変更することは難しいようです。

ただ、でふぁいあんとさんの投稿によれば、ServerXMLHTTP ではなく
XMLHTTP を用いた場合には、条件次第では通信が行えているようなので、
その情報を元に、追加調査してもらっています。

それでも解決策が見つからない場合、ActiveX (COM)系での通信ではなく、
.NET 系の実装が代替案となってくるかもしれません。
まぁ、.NET で通信できるのかどうかも怪しいところですが…。



> 前回、PowerShellとVBScriptについてお聞きしたので
今のところ、XMLHTTP + ログオン状態で成功するというのは、
どのパターンのときでしょうか?

・VB6 で作った EXE をダブルクリックで起動
・VB6 で作った EXE を、「ユーザーがログオンしているときのみ実行」でスケジュール起動
・VB6 で作った EXE を、「ユーザーがログオンしているかどうかに関わらず実行」
・『vb6.exe /runexit プロジェクトファイル』をダブルクリックで起動
・『vb6.exe /runexit プロジェクトファイル』を「ログオンしているときのみ」で起動
・『vb6.exe /runexit プロジェクトファイル』を「ログオンしているかどうかに関わらず」で起動



> > 初回と2回目とで、リクエストヘッダー/レスポンスヘッダーの内容を確認してみてください。
> > http://winofsql.jp/VA003334/infoboard.php?mid=sh_web&id=100618110711&pid=1
> はい、これは今から調べてみます

とは言ったものの、リクエストヘッダーの取得は難しいかも知れません。
とりあえず、レスポンスヘッダーだけでも確認してみて下さい。

具体的には、1回目(.status = 400) と 2回目(.status = 200)それぞれの
.getAllResponseHeaders() の結果を取得するという事です。


スケジューラーから呼び出した場合において、初回と二回目で
ヘッダーの内容がどう変わるのかは分かりませんが、たとえば
1回目の応答で、"Set-Cookie:" が返されているようであれば、
2回目の呼び出しに、
 .setRequestHeader "COOKIE", [クッキーの中身]
を加えることで、状況が変わるかもしれません。

その場合、クッキーの内容は、.getResponseHeader("Set-Cookie")
または .getAllResponseHeaders() から取得することになるでしょう。
(Set-Cookie が複数送信されてくる場合は、getAllResponseHeaders の方が良いかも)

[ツリー表示へ]
タイトルRe^5: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16170
投稿日: 2015/08/07(Fri) 17:03
投稿者でふぁいあんと
お返事遅れました。m(__)m
> それでも解決策が見つからない場合、ActiveX (COM)系での通信ではなく、
> .NET 系の実装が代替案となってくるかもしれません。
> まぁ、.NET で通信できるのかどうかも怪しいところですが…。
vb2008で作ったみたのですがやはり同じ挙動ですね

> 今のところ、XMLHTTP + ログオン状態で成功するというのは、
> どのパターンのときでしょうか?
xml.send にてpost内容を無しで通信し
xmlstatus=400 を取得後、
xml.send [post内容]で通信して xml.status = 200を受信することを成功とします
また、ログオン状態です

> ・VB6 で作った EXE をダブルクリックで起動
成功
> ・VB6 で作った EXE を、「ユーザーがログオンしているときのみ実行」でスケジュール起動
成功
> ・VB6 で作った EXE を、「ユーザーがログオンしているかどうかに関わらず実行」
[パスワードを保存しない]のチェックの有無に関係なく
初回のxml.send で、xml.status = 0
次回のxml.send [post内容]で xml.status= 0 で失敗

> ・『vb6.exe /runexit プロジェクトファイル』をダブルクリックで起動
成功
> ・『vb6.exe /runexit プロジェクトファイル』を「ログオンしているときのみ」で起動
成功
> ・『vb6.exe /runexit プロジェクトファイル』を「ログオンしているかどうかに関わらず」で起動
成功
という結果になりました

> 具体的には、1回目(.status = 400) と 2回目(.status = 200)それぞれの
> .getAllResponseHeaders() の結果を取得するという事です。
結果ですが、
400のとき
Date: Fri, 07 Aug 2015 07:43:43 GMT
P3P: policyref="ttp://******", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Content-Type: application/xml
Age: 0
Connection: keep-alive

200のとき
Date: Fri, 07 Aug 2015 07:45:06 GMT
P3P: policyref="ttp://******", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cache-Control: private
Content-Type: application/xml
Age: 4
Connection: keep-alive
となって、ageくらいしか違いがありませんでした。

[ツリー表示へ]
タイトルRe^6: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16172
投稿日: 2015/08/07(Fri) 17:38
投稿者魔界の仮面弁士
> > それでも解決策が見つからない場合、ActiveX (COM)系での通信ではなく、
> > .NET 系の実装が代替案となってくるかもしれません。
> > まぁ、.NET で通信できるのかどうかも怪しいところですが…。
> vb2008で作ったみたのですがやはり同じ挙動ですね
VB2008 で COM を使わない通信というと、System.Net.HttpWebRequest クラスでしょうか?


> となって、ageくらいしか違いがありませんでした。
Age ヘッダーは、キャッシュデータの場合の経過秒数なので関係無さそうですね…。

[ツリー表示へ]
タイトルRe: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16171
投稿日: 2015/08/07(Fri) 17:15
投稿者魔界の仮面弁士
ServerXMLHTTP を使う限りは、先の回答どおり、Yahoo 側で
サーバー設定を調整してもらうしかないという結論が出ました。

今回の URL は、ServerXMLHTTP での通信が事実上不可能です。
(他の Yahoo API では OK なのに…)


現在は、XMLHTTP での無人実行が可能かどうかを調査してもらっています。
ServerXMLHTTP を提案したのは私なので、何というか申し訳ない…。


------
以下余談。

ServerXMLHTTP であれ Internet Explorer であれ、今回の問題となっている
 https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/reservePublish
に対してアクセスした場合、Client Hello から Server Hello までは問題なく進みます。

※ Client Hello や Server Hello については、下記などを参照。
 http://ash.jp/sec/ssl.htm


しかし Server Hello まで進んだ後の動作は、ServerXMLHTTP と Internet Explorer とで
差異がありました。ServerXMLHTTP ではクライアント証明書を送信するのに対し、
IE では Client Key Exchange に進むという違いがあります。

そのため、IE では通信できても、ServerXMLHTTP ではエラーになるという事態が生じます。


ServerXMLHTTP のこの動作は、下記「参考資料」の TLS Handshake の順番で処理されます。

[TLS Handshake Protocol]
https://msdn.microsoft.com/en-us/library/windows/desktop/aa380513.aspx

[SSL/TLS in Detail]
https://technet.microsoft.com/en-us/library/cc785811.aspx


今回の URL に対し、クライアント証明書の送信処理をスキップすることができないかも
調査してもらいましたが、ServerXMLHTTP の現在の実装では、残念ながらこの部分を
回避するための機能が用意されておらず、動作を変更することはできないようです。
------

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16173
投稿日: 2015/08/10(Mon) 14:21
投稿者でふぁいあんと
> 現在は、XMLHTTP での無人実行が可能かどうかを調査してもらっています。
> ServerXMLHTTP を提案したのは私なので、何というか申し訳ない…。

とんでもないですよ
いつも有意義な情報ありがとうございます。
引き続きxmlHTTPの情報にわずかな望みをかけています。

ただ、このままvbp起動を続けるのが不安なので
まったく違う環境でプログラム作るしかないかな
と思っています

ざくっとした質問で申し訳ありませんが
xml通信を自動実行できる環境は現状
>VB2008 で COM を使わない通信というと、System.Net.HttpWebRequest クラスでしょうか?
とお考えですか
accessDBとのデータ交換があるので、win環境がいいと
考えています。

vbscriptは途中なのですが、xmlHTTP前提だったので
意味ないかなと思っています。
powershellとか現行VB,C#勉強したほうがいいでしょうか

[ツリー表示へ]
タイトルRe^3: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16174
投稿日: 2015/08/10(Mon) 16:40
投稿者魔界の仮面弁士
> ただ、このままvbp起動を続けるのが不安なので
避けたいですね…。


> xml通信を自動実行できる環境は現状
単純な通信だけであれば、VB6 からは
 UserControl の AsyncRead メソッド
 Inet の Execute メソッド
 ADODB.Stream の Open メソッド
などの選択肢があるのですが、いずれも今回の要件は満たせそうにないですね。
案件上、mswinsck や SoapClient も使えそうにはないですし。

MSXML*.DLL が本命ではあるのですけれども、果たして回避策があるのか否か…。


> VB2008 で COM を使わない通信というと、System.Net.HttpWebRequest クラスでしょうか?
> とお考えですか
あれ? 『vb2008で作ったみた』のですよね。その時は何を使ったのでしょうか?


> vbscriptは途中なのですが、xmlHTTP前提だったので
> 意味ないかなと思っています。
言語的には VB6 に類似しているので、移植で悩むことは少なそうですが、
VBScript から利用可能な通信手段は基本的に ActiveX DLL だけなので、
今回の代替選択肢にはなりにくそうですね。

VB6 にはできなくて、VBScript であれば可能な点があるとすれば
 ・32bit / 64bit の両方に対応可能
 ・コンソールアプリとして動作可能
ぐらいでしょうか。それがアドバンテージとなりうるかは別として。


> powershellとか現行VB,C#勉強したほうがいいでしょうか

今回の件がどうであれ、勉強はしておいた方が良いとは思いますよ。
使える言語は多いに越したことはありませんし、何より VB6 は古すぎます。

とはいえ、今回、言語を変更するべきかどうかは別問題です。

そもそも今回の問題は、サーバー側の設定の微妙な差異によるものだと思っています。
他の URL では問題が起きていないわけですしね。

そしてその回避方法は現時点で明確になっていないため、対処方針の一つとして
『他の通信ライブラリで試してみること』を選択肢に挙げているわけですが、
言語を変更する必要があるかどうかは、そのライブラリ次第ということになりそうです。

極端な話、Web API を呼び出すためのライブラリが JCL だったのなら、必然的に
Java から利用する事になりますし、あるいは PowerShell の Cmdlets として
作られていたのなら、選択肢もおのずと PowerShell に限られてくるわけです。
通信手段が .NET Framework のライブラリなのだとしたら、C# や VB.NET の出番でしょう。

(問題は、今回の Yahoo API の URL に対応した通信ライブラリがあるか否か…)

[ツリー表示へ]
タイトルRe^4: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16175
投稿日: 2015/08/11(Tue) 15:12
投稿者でふぁいあんと
> 避けたいですね…。
はい

> > VB2008 で COM を使わない通信というと、System.Net.HttpWebRequest クラスでしょうか?
> > とお考えですか
> あれ? 『vb2008で作ったみた』のですよね。その時は何を使ったのでしょうか?
 元ソースをvb2008の自動コンバート機能を使って、微調整してみました
それで今気がついたのですが、objXML.sendの前でエラーが出ていましたm(_ _)m
  あまりに単純すぎでweb検索でも答えが見つかりません
  *vb2008*
  Dim objXML As New MSXML2.XMLHTTP60
  objXML.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
 ↑ここで
 「COMExceptionはハンドルされませんでした HREUSLTからの例外 0xC00C023E」
  これ、どんなエラーなのでしょうか

 とはいっても、これって結局COMを使ってることになるので、
 本質的な結果は同じですよね。


[ツリー表示へ]
タイトルRe^5: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16176
投稿日: 2015/08/11(Tue) 15:24
投稿者魔界の仮面弁士
>  とはいっても、これって結局COMを使ってることになるので、
>  本質的な結果は同じですよね。
そうですね。そして、COM を使うのであれば、VB6 の方が確実だと思います。
.NET からだと、COM オブジェクトの呼び出しのオーバーヘッドが入りますし。

> 元ソースをvb2008の自動コンバート機能を使って、微調整してみました
VB2008 もそれなりに古いツールですね。


>  「COMExceptionはハンドルされませんでした HREUSLTからの例外 0xC00C023E」
>   これ、どんなエラーなのでしょうか

それは、VBA 等でもおきますよね。
VB6 や VBA で呼び出した場合のメッセージは
|
| 実行時エラー '-1072954818 (c00c023e)':
| open メソッドが呼び出されるまで、このメソッドを呼び出すことはできません。
|
です。

[ツリー表示へ]
タイトルRe^6: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16177
投稿日: 2015/08/11(Tue) 18:08
投稿者でふぁいあんと
> それは、VBA 等でもおきますよね。
> VB6 や VBA で呼び出した場合のメッセージは
> |
> | 実行時エラー '-1072954818 (c00c023e)':
> | open メソッドが呼び出されるまで、このメソッドを呼び出すことはできません。
> |
> です。

うわうわーーやってしまいました。
誠に申し訳ないです。。なれぬツールだったものですから。
エラーの見方がわかったので大変ありがとうございます。

結果として vb2008 + xmlhttp60でも、
同じような挙動ですね。ログオン状態で、タスクスケジューラから実行すると
正常に行きますが
タスクのオプションにて「ログオンしていなくても」にチェックをつけると
今度は、objxml.post "" のところで止まってしまうようです。

引き続き System.Net.HttpWebRequest の方をやってみます

[ツリー表示へ]
タイトルRe^2: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16178
投稿日: 2015/08/13(Thu) 09:49
投稿者魔界の仮面弁士
階層が深くなってきたので、またスレッドを切ります。
(この掲示板では、古い投稿には返信できない仕様なので、妙なところに繋いでいますがご容赦を…)



> クライアント証明書の入手先もわからないので、、
自己証明書を作成し、そのクライアント証明書を使うか、
もしくは、第三者機関(たとえば下記)から入手した証明書を使う事になります。
https://jp.globalsign.com/contact/request/testpki.html

その証明書を、Yahoo 側が受け入れてくれるかどうかは別問題ですが。
(Microsoft 側で検証した限りでは、自己証明書では認証されなかったとのことです)


なお、Microsoft サポートからは、本件に関して COM/ActiveX での対応はできず、
.NET Framework での対応が必要との見解が報告されてきています。

そして少なくとも、.NET Framework の「System.Net.HttpWebRequest クラス」であれば、
HTTP ステータス 401 を得られることを確認できています。

ただし、私も Microsoft も、Yahoo API のアクセストークンを持ち合わせていないため、
ステータス 200 が返されるのかどうかまでは確認できません。
でふぁいあんとさんの側で追加検証の上、結果を教えてもらえるとありがたいです。
(HttpWebRequest の使い方が分からない場合、隣の VB.NET 掲示板で質問いただければ対応します)



なお、COM ベースで対応できないとの結論に至った理由としては:

・ServerXMLHTTP にしろ XMLHTTP にしろ、https://circus.shopping.yahooapis.jp にアクセスした際は、
 クライアントに対して証明書が求められる結果となる。

・ServerXMLHTTP と XMLHTTP どちらのオブジェクトも、send メソッド時に実行時エラーとなるが、
 この時、本来はサーバーから受け取っているはずの応答を、プロパティに設定していないため、
 その内容を status プロパティ等で得ることができない状況にある。

・また、WinHttp.WinHttpRequest.5.1 での動作も同様の実装となっており、
 「信頼されていない機関によって証明書チェーンが発行されました。」
 のエラーが発生する結果になる。

とのことです。


これだと、無人実行ができなくて、有人実行なら成功することの説明にはなっていない気はするのですが、
何にせよ、開発プラットフォームを .NET 系(VB.NET、C#、PowerShell 等)に移したほうが良さそうですね。

---
追記:

Option Explicit
Dim oXMLHTTP
Const URL = "https://circus.shopping.yahooapis.jp"
Set oXMLHTTP = CreateObject("Msxml2.XMLHTTP.6.0")
Call oXMLHTTP.open("GET", URL, False)
Call oXMLHTTP.send()
Call MsgBox(oXMLHTTP.status)


上記は VBScript のコードです。(test.vbs)

ログオン状態での実行検証を行ったところ、当方環境では
32bit / 64bit どちらにおいても、send メソッドが失敗しました。

 エラー 800C000E『セキュリティの問題が発生しました。』


ところが、同じコードを VB6 / VBA(32bit) / VBA(64bit) / VB.NET(32bit) / VB.NET(64bit) から
実行した場合には、エラーになることなく status 401 が返却されてきました。
もっとも、.NET アプリケーションからの MSXML の使用はサポートされていないようですけれどね。
  https://support.microsoft.com/ja-jp/kb/815112


でふぁいあんとさんの環境では、VB6 + XMLHTTP において、status 400 が
返されてたとのことですが、上記コードでも(401 ではなく)400 が返されるのでしょうか。


まぁいずれにせよ、今回の件については HttpWebRequest クラスに移行するべきなのだと思います。

[ツリー表示へ]
タイトルRe^3: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16179
投稿日: 2015/08/18(Tue) 17:57
投稿者でふぁいあんと
魔界の仮面弁士様 いつも大変お世話になっております
あくまでも中間報告ですが
ほぼうまくいくかもです。(笑)


> でふぁいあんとさんの環境では、VB6 + XMLHTTP において、status 400 が
> 返されてたとのことですが、上記コードでも(401 ではなく)400 が返されるのでしょうか。
同じパラメータを与えてみてvb6とvbscriptをほぼ同時に実行してみましたが
vb6では400ですが
vbscriptでは、
 エラー 800C000E『セキュリティの問題が発生しました。』
になり、statusの取得まで実行できませんでした

そこで、ご指導のいただいた
vb.net(2013)環境にて、exeを作成したところ(時間かかりました( ;∀;))
exe単体の実行->成功
タスクマネージャーにて、[ユーザーがログオンしているときのみ]->成功
タスクマネージャーにて、[ユーザーがログオンにかかわらず]->成功
タスクマネージャーにて 1分後に実行設定 対象パソコンをロック->成功です。

しかしvb2013環境は、exeがどこかわからない
エラー処理がわからない
ビルドって何?
変数チェックってどうやるの?
状態ですが、元ソースの移行ならなんとかなるかな
って感じで本片手になんとかやってみます。

といいつつ、
>HttpWebRequest の使い方が分からない場合、隣の VB.NET 掲示板で質問いただければ対応します
甘えさせてもらいます。m(_ _)m

今回も長々とお世話になりました。
msにご質問までしていただきまして恐縮です。
費用などかかってないのでしょうか?
できればお礼などしたいのですが、何か方法ないでしょうか

[ツリー表示へ]
タイトルRe^4: MSXML2.XMLHTTP60 をログオフ状態で使用
記事No16180
投稿日: 2015/08/18(Tue) 19:34
投稿者魔界の仮面弁士
> vb.net(2013)
2008 はチョット古いかな…と思っていましたが、2013 を選択されたのですね。
(ちなみに最新は 2015 です)
2013 の場合、最新版は Update 5 ですね。


> exe単体の実行->成功
> タスクマネージャーにて、[ユーザーがログオンしているときのみ]->成功
> タスクマネージャーにて、[ユーザーがログオンにかかわらず]->成功
> タスクマネージャーにて 1分後に実行設定 対象パソコンをロック->成功です。
おめでとうございます!

HttpWebRequest の利用にあたり、追加の質問等はありそうですか?
問題が無いようであれば、マイクロソフトへの問い合わせもクローズさせてもらいますね。


> 状態ですが、元ソースの移行ならなんとかなるかな
> って感じで本片手になんとかやってみます。
まぁ、移行の良い機会だったということで。(^^;


> msにご質問までしていただきまして恐縮です。
> 費用などかかってないのでしょうか?
不具合系の問い合わせならばインシデントは消費しないのですが、
今回は調査系の問い合わせなので、インシデントは消費すると思います。
http://www.microsoft.com/ja-jp/services/professional.aspx

ただ、コミュニティへの貢献のために限定して、年間 3 インシデント分の
無償サポート枠を マイクロソフト MVP アワード プログラムより
頂いていますので、今回の問い合わせに関する費用は発生していません。

# メールや電話対応に要した時間は工数として発生していますが
# それはコミュニティ活動の一環ということで、平常運転。


> できればお礼などしたいのですが、何か方法ないでしょうか
こちらも勉強になったのでお気になさらず。
どこかでお会いすることがあったら、ジュースでも奢ってくださいな。

[ツリー表示へ]