none
WNetAddConnection2でネットワーク資源に接続できなくなる RRS feed

  • 質問

  • .NET Framework 2.0 で動作するアプリケーションで、
    WNetAddConnection2 関数を使用してサーバーに接続していたのですが、
    WindowsUpdateで.NET Framework 3.0,3.5がインストールされると、
    一部のクライアントでERROR_BAD_PROVIDERのエラーが出るようになってしまいました。
    (エラーがでないクライアントも存在します)

    試しにコントロールパネルのプログラムの追加と削除で.NET Framework を削除し、
    2.0だけを再インストールすると正常に動作するようになり、
    その後3.0,3.5を再インストールすると、やはりサーバーに接続できなくなってしまいます。

    3.0,3.5をインストールしてアプリケーションでサーバーに接続できなくなった場合でも、
    アプリケーションを起動する前に"ファイル名を指定して実行"などでサーバーのフォルダなどを一度開いておくとアプリケーションで接続でるようになります。
    ただしPCを再起動すると、またアプリケーションでは接続できなくなってしまいますので、事前のアクセスが必要となります。

    なぜこのような現象が出るかが分からず、アプリケーションを修正するにしてもどこを修正すればいいか見当もつかず悩んでいます。
    どなたか解決方法をご存知の方いらっしゃいましたら、ご助力願えませんでしょうか。

    よろしくお願いいたします。


    --------------------
    以下環境などです。

    クライアント環境
    OS:WindowsXP SP3

    開発環境
    ツール:Microsoft Visual Studio 2005 Professional Edition
    言語:VB
    コード:
    ==========
    Imports System.Net
    Public Class AAA
        Public Declare Function WNetAddConnection2 Lib "mpr.dll" _
          Alias "WNetAddConnection2A" (ByRef lpNetResource As NETRESOURCE, _
          ByVal lpPassword As String, ByVal lpUserName As String, _
          ByVal dwFlags As Integer) As Integer

        Public Structure NETRESOURCE
            Public dwScope As Integer
            Public dwType As Integer
            Public dwDisplayType As Integer
            Public dwUsage As Integer
            Public lpLocalName As String
            Public lpRemoteName As String
            Public lpProvider As String
        End Structure

        ~~~

        Dim nr As New NETRESOURCE
        With nr
            .dwScope = 1
            .dwType = 0
            .dwDisplayType = 3
            .lpLocalName = ""
            .lpRemoteName = "\\server"
        End With
        return_code = WNetAddConnection2(nr, PASSWORD, USER, 0)
          (※ここでreturn_codeに1204が返ってきてしまいます)

      ~~~

    End Class
    ==========

    2010年4月7日 10:13

回答

  •     Public Structure NETRESOURCE
            Public dwScope As Integer
            Public dwType As Integer
            Public dwDisplayType As Integer
            Public dwUsage As Integer
            Public lpLocalName As String
            Public lpRemoteName As String
            Public lpProvider As String
        End Structure


    確認したいのですが、Structure の定義はこのままでしょうか?
    これだとメンバーが1つ足りないです。(lpRemoteName と lpProvider との間に lpComment が入るはず)

     NETRESOURCE Structure (Windows)
     http://msdn.microsoft.com/en-us/library/aa385353(VS.85).aspx

    上記のままの Structure 定義だと本来 lpProvider であるはずのエリアに不定な値が入るため、不安定な動作をする理由の説明もつくのですが。

    • 回答としてマーク 菊地俊介 2010年4月27日 1:53
    2010年4月19日 9:13

すべての返信

  • こんにちは、nekonote さん。

     .NET Framework 3.5 に関する Windows Update で問題が発生するのであれば、.NET Framework 2.0 SP2 と .NET Framework 3.5 SP1 の互換性の問題に関係あるのかもしれません。
    互換性の問題に対応する修正モジュールが公開されていますので、回避できるか試してみてはいかがでしょう。

    こちらは、.NET Framework 3.5 SP1 の資料になります。
     [ダウンロードセンター] Microsoft .NET Framework 3.5 Service Pack 1
     http://www.microsoft.com/downloads/details.aspx?FamilyID=AB99342F-5D1A-413D-8319-81DA479AB0D7&displaylang=ja
      重要 : .NET Framework 3.5 SP1 パッケージ (ブートストラップ パッケージまたは完全なパッケージ) のインストール後、すぐに更新プログラム KB959209 をインストールして、アプリケーションの互換性に関する一連の既知の問題を解決してください。

     An update for the .NET Framework 3.5 Service Pack 1 is available
     http://support.microsoft.com/kb/959209/en-us

    以下の資料も参考になると思います。互換性に関する情報がわかりやすいと思います。あと、インストールをブロックする方法についての案内があります。
    なお、設定にはレジストリの変更を要するものになりますので注意が必要です。

     Windows Updateによる.NET Framework 3.5 SP1のインストールをブロックする
     http://www.atmarkit.co.jp/fwin2k/win2ktips/1257ds35sp/ds35sp.html

    その他、参考資料です。

     Microsoft .NET Framework 3.5 Service Pack 1
     http://msdn.microsoft.com/ja-jp/netframework/cc807042.aspx

     How to temporarily block the installation of the .NET Framework 3.5 Service Pack 1
     http://support.microsoft.com/kb/959211/ja


    他にもどなたか情報をお持ちの方がいらしたら、ぜひ投稿をお願いいたします。
    それではまた。

    2010年4月12日 4:23
  • 山本春海様
    ご返信下さりありがとうございます。

    教えていただきました内容の互換性に問題がある部分に関して検証しようとしたのですが、
    .NET Frameworkを入れなおしている過程でWindows UpdateのKB951847(.NET Version 2.0~3.5用 Microsoft .NET Framework 3.5 Service Pack 1 および .NET Framework 3.5 ファミリ更新プログラム x86)をインストールすると、KB959209に含まれるKB958481,KB958483,KB958484も同時にインストールされるようです。

    問題となっている現象は、これらがインストールされている上で出ていますので、互換性の問題でなく他に原因があるのかもしれません。

    引き続き調査していますが行き詰っていますので、他にも何か情報が見つかりましたら教えていただけるとありがたいです。
    皆様よろしくお願いいたします。

    2010年4月14日 8:39
  • <StructLayout(LayoutKind.Sequential)> _
    Public Structure NETRESOURCE
    ・・・

    のように Sequential を指定しても同じでしょうか?(本来はすべきなようです)
    それと関係ないと思いますけど、以下のように vbNullString を代入しても同じでしょうか?

    With nr
        .dwType = 0 'RESOURCETYPE_ANY
        .lpLocalName = vbNullString
        .lpRemoteName = "\\server"
        .lpProvider = vbNullString
    End With

    2010年4月15日 5:27
  • TH01様
    ご返信下さりありがとうございます。

    ご指摘くださった記述を追加してそれぞれ試してみたのですが現象は変わりませんでした。

    2010年4月19日 8:14
  •     Public Structure NETRESOURCE
            Public dwScope As Integer
            Public dwType As Integer
            Public dwDisplayType As Integer
            Public dwUsage As Integer
            Public lpLocalName As String
            Public lpRemoteName As String
            Public lpProvider As String
        End Structure


    確認したいのですが、Structure の定義はこのままでしょうか?
    これだとメンバーが1つ足りないです。(lpRemoteName と lpProvider との間に lpComment が入るはず)

     NETRESOURCE Structure (Windows)
     http://msdn.microsoft.com/en-us/library/aa385353(VS.85).aspx

    上記のままの Structure 定義だと本来 lpProvider であるはずのエリアに不定な値が入るため、不安定な動作をする理由の説明もつくのですが。

    • 回答としてマーク 菊地俊介 2010年4月27日 1:53
    2010年4月19日 9:13
  • totojo様
    ご返信下さりありがとうございます。

    ご指摘くださった定義のメンバーを追加して試したところエラーが出なくなりました。

    事情により今年に入って引き継いだアプリでしたが、今まで2年間問題なく動作していたとのことだったのでNETRESOURCEの定義に不備はないものとの先入観があり、定義のメンバーに関しては調査対象から漏れてしまっていました。

    この箇所を修正したもので全クライアントで現象が出なくなるか確認してみます。

    2010年4月20日 1:50
  • 修正したものを導入したクライアントで現象が出なくなりましたのでこの件は解決となりました。

    貴重なお時間を割いてこの件に関して調査してくださった方々、誠にありがとうございました。

    2010年5月6日 1:12