WNetAddConnection2で接続後、違うユーザーで接続するには

解決


kazu  2007-11-23 21:43:28  No: 99770

お世話になります。やりたいことはWindows2003serverにある複数の共有フォルダ(ユーザーによって権限が違う)に1つ端末からユーザー、アクセス先フォルダを選択して接続できるようにしたいのです。そこでVB6のWNetAddConnection2(ネットワークドライブは空白)で接続先(\\172.17.1.201\共有フォルダ名)、ユーザー名、パスワードを指定して接続しました。端末立ち上げ後の最初の接続はうまくいくのですが、違うユーザーを選択して実行すると「1つのパソコンから複数のユーザーで接続できません」との内容で接続に失敗します。そこでWNetCancelConnection2("\\172,17,1,201", 0,true)で切断命令を入れましたが、やはり失敗となりました。どうしたらよいのでしょうか。宜しくお願いします。


もげ  2007-11-26 22:07:48  No: 99771

> そこでWNetCancelConnection2

CONNECT_UPDATE_PROFILEを指定してみるとどうなりますか?
Const CONNECT_UPDATE_PROFILE = &H1
かな。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwnet/html/_win32_wnetcancelconnection2.asp

また、戻り値はどうなっていますか?(成功しているか否かを判定していますか?)


kazu  2007-11-28 03:24:19  No: 99772

もげ様、ありがとうございます。
職場でしか試すことができませんので、明日(水曜日)に試して結果を報告します。


kazu  2007-11-29 04:16:42  No: 99773

Const CONNECT_UPDATE_PROFILE = &H1としましたが、結果は今までと同様で「既に切断済みです。」とでます。
困りました。宜しくお願いします。


もげ  2007-11-29 19:55:56  No: 99774

切断後に、コマンドプロンプトで
NET USE 
と打って結果を確認してみてください。
>「1つのパソコンから複数のユーザーで接続できません」との内容
が正しいとすると、
何か余計なものがでてきたりして。


GOD  2007-11-29 20:17:10  No: 99775

昔作成したサンプルですが、これではどうなりますか。
画面にはテキストボックスを3つ(txtUserName, txtPassword, txtRemoteName)
とボタンを2つ用意して(cmdConnect, cmdDisconnect)下さい。
ユーザー、パスワードを変更して何回か接続/切断を繰り返しましたが、NT4.0 
Serverには接続はできてることは確認してます。(2003Serverは手元にないので未確認)
API, ユーザー定義型などは都度補足してください。

Option Explicit

'接続ボタン
Private Sub cmdConnect_Click()
    Dim udtnr As NETRESOURCE
    Dim lngAPIRet As Long
    Dim strDmy As String

    With udtnr
        .dwType = RESOURCETYPE_DISK
        .lpLocalName = ""
        .lpRemoteName = txtRemoteName
        .lpProvider = ""
    End With
    lngAPIRet = WNetAddConnection2(udtnr, txtPassword, txtUserName, 0)
    If lngAPIRet = NO_ERROR Then
        strDmy = "接続成功"
    Else
        strDmy = "接続失敗(" & lngAPIRet & ")"
    End If
    lblReturnCode.Caption = strDmy
End Sub

'切断ボタン
Private Sub cmdDisconnect_Click()
    Dim lngAPIRet As Long
    Dim strDmy As String

    lngAPIRet = WNetCancelConnection2(txtRemoteName, CONNECT_UPDATE_PROFILE, 1)
    If lngAPIRet = NO_ERROR Then
        strDmy = "切断成功"
    Else
        strDmy = "切断失敗(" & lngAPIRet & ")"
    End If
    lblReturnCode.Caption = strDmy
End Sub


kazu  2007-11-30 07:13:28  No: 99776

もげ様、GOD様  ありがとうございます。
明日、職場で試してみます。
NT4.0Serverでは、できた事を知り希望がでてきました。


もげ  2007-11-30 17:41:02  No: 99777

そのPCのログインユーザで接続している等、
そのサーバへ既にセッションがはられていると、
WNetCancelConnection2()が失敗しますね。

コード1219で、
|同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続
|は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、
|再試行してください。
ということになるとか。

サーバ側のコマンドプロンプトで
NET SESSION
と打って、
そのクライアントPCからのセッションが残っていないか確認してみてください。

それから、
Sever2003のSP無しの場合には、
http://support.microsoft.com/kb/887707/ja
という問題もあるようです。


kazu  2007-12-01 05:47:02  No: 99778

もげ様  ありがとうございます。
パソコンを立ち上げ直後にWindowsXpのスタートの検索で2003serverのアドレスをいれ検索し、でてきた対象のサーバーをクリックするとユーザー名とパスワードを聞いてきます。そこをキャンセルしてWNetAddConnection2で接続すると、どのユーザーでもユーザーを変更しない限り接続できます。WNetAddConnection2の後にはWNetCancelConnection2を入れてますが「既に切断済みです。」とでます。接続できた後、ユーザーを変更して接続しようとするとコード1219がでて接続できません。その後に前述のスタートからの検索をしてサーバーをクリックするとユーザー名、パスワードを聞かれることもなくユーザーの共有ディレクトリーがでてきます。net use では「新しい接続は記憶されません」と、成功した接続の内容がでてきます。
2003serverのバージョンについての内容は今日読みましたので正確なことは職場にいかなければ分かりませんが、今年の春に購入した2003serverですので、SP1だと思います。月曜日に報告します。
宜しくお願いします。

GOD様、お世話になります。結果としては接続できませんでした。詳細は別に書かせて頂きます。


kazu  2007-12-01 08:29:54  No: 99779

GOD様、お世話になります。下記に試した内容を記述します。
   Private Type NETRESOURCE
        UScope As Long
        UType As Long
        UDType As Long
        UUsage As Long
        UDrive As String
        URmt As String
        UCmt As String
        UPro As String
    End Type

    Private PBU_RCODE_LNG As Long
    Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
        (lpNetResource As NETRESOURCE, ByVal lpPassword As String, _
        ByVal lpUserName As String, ByVal dwFlags As Long) As Long

    Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" _
        (lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long

    ' 接続
    Private sub Mount()
        Dim PBU_WNET_TYPE As NETRESOURCE
        Dim PBU_WNET_FLG As Long
        
        PBU_WNET_TYPE.UScope = &H2
        PBU_WNET_TYPE.UType = &H1
        PBU_WNET_TYPE.UDType = &H3
        PBU_WNET_TYPE.UUsage = &H1
        PBU_WNET_TYPE.UPro = ""
        PBU_WNET_TYPE.UCmt = ""
        PBU_WNET_FLG = &H0
     
        PBU_WNET_TYPE.UDrive = "" 'ドライブ名称 
        PBU_WNET_TYPE.URmt = "\\コンピュータ名\共有ディレクトリー名"
  
        PBU_RCODE_LNG = WNetAddConnection2(PBU_WNET_TYPE,ユーザー名, パスワード, 0)
  
        Select Case PBU_RCODE_LNG
            Case 0&
                'MsgBox ("正常終了")
                Mount = "ok"
                Exit Function
            Case 53&
                MsgBox ("サーバ(コンピュータ名)が見つかりません。")
            Case 67&
                MsgBox ("PATHが見つかりません(共有になっていません)。")
            Case 85&
                MsgBox ("既に接続済みです。")
            Case Else
                MsgBox (PBU_RCODE_LNG & " サーバーに接続できません。")
        End Select
        call UnMount() 
    End sub

    ' 切断
    Private Sub UnMount()
        Dim PBU_WNETC_UDrive As String
        Dim PBU_WNETC_UFlg1 As Long
        Dim PBU_WNETC_UFlg2 As Long

        PBU_WNETC_UFlg1 = &H0
        PBU_WNETC_UFlg2 = 1&
        'PBU_WNETC_UDrive = ""      'ドライブ名称   H:

        PBU_RCODE_LNG = WNetCancelConnection2("\\コンピュータ名\共有ディレクトリー名", PBU_WNETC_UFlg1, PBU_WNETC_UFlg2)
 
        Select Case PBU_RCODE_LNG
            Case 0&
                MsgBox ("正常終了")
            Case 2250&
                MsgBox ("既に切断済みです。")
            Case Else
                MsgBox (PBU_RCODE_LNG)
        End Select

    End Sub

略しますとこのようになります。間違っているのでしょうか。
UnMountの部分はいろいろ変えましたが常に「既に切断済みです」と返ってきます。
宜しくお願いします。


GOD  2007-12-02 09:15:48  No: 99780

う〜ん、「これだ!」というのは見当たらないですね。
>WNetAddConnection2(PBU_WNET_TYPE,ユーザー名, パスワード, 0)
>
ユーザー名とパスワードが逆になっているのは単なる書き間違えと思っていいんですよね。(一応確認)

あと、WNetAddConnection2の第一引数ですが
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwnet/html/_win32_wnetaddconnection2.asp
を見ると特定部分以外は無視するとなっていますが、他部分に値を入れないようにしてみてはどうでしょうか。

>net use では「新しい接続は記憶されません」と、成功した接続の内容がでてきます。
>
↑は接続先とユーザー名が表示されるということでしょうか。

接続後に切断しようとすると「既に切断済み」となっているのが気になりますね。
接続と切断で"\\コンピュータ名\共有ディレクトリー名"は合っていますか?
実験的にモジュールレベル変数を用意してそこに「"\\コンピュータ名\共有ディレクトリー名"」を入れて使用してみてはどうでしょう。


kazu  2007-12-02 16:54:21  No: 99781

GOD様、お世話になります。
ユーザー名とパスワードが逆になっています。済みません。接続と切断の\\コンピュータ名\共有ディレクトリー名は合っています。実際にはsetuzokusakiという変数にして使用しています。net useでは接続先はでますが、ユーザー名はでていなかったと思います。確認します。WNetAddConnection2の第一引数については月曜日に職場で試して、ご返答します。
宜しくお願いします。


もげ  2007-12-03 18:30:00  No: 99782

>net use では「新しい接続は記憶されません」と、成功した接続の内容がでてきます。

切断がうまくいっていないようにみえますね。

問題の切り分けのため、
接続/切断をAPIではなく、
NET USEコマンドに置き換えて試してみてはいかがでしょう?

・接続をAPI、切断をNET USE
・接続をNET USE、切断をAPI
・接続をNET USE、切断をNET USE
の3パターンで、
それぞれ、接続後、切断後に
NET USEコマンドで状況確認してみてください。

http://ykr414.com/dos/dos03net.html#11


kauz  2007-12-04 06:41:18  No: 99783

もげ様、GOD様、大変済みませんが、今日は試すことができませんでした。明日は必ず試します。


kazu  2007-12-05 07:15:30  No: 99784

もげ様、お世話になります。試した結果を報告します。
サーバー名:MAIN_PC  共有フォルダ名:kyouyuu ユーザー名:uketuke  パスワード:pas11  として
接続のDOSコマンド:net use \\MAIN_PC\kyouyuu pas11 /user:uketuke /persistent:no
切断のDOSコマンド:net use \\MAIN_PC\kyouyuu pas11 /user:uketuke /dellete
で試しましたが、これでよいのでしょうか。
①接続をAPI、切断をNET USEのNET USEの結果
接続の結果:「新しい接続は記憶されません」、ステータス:OK、ローカル名:空白、リモート名:\\MAIN_PC\kyouyuu、「コマンドは正常に終了しました」
切断の結果:上記と全く同じ内容が表示されました。切断ができてないと思われます。
②接続をNET USE、切断をAPIの結果は①と同じでした。
③接続をNET USE、切断をNET USEの結果は①と同じでした。
上記の①〜③はすべて再起動をかけてから試しました。
続けて、ユーザー名:uketukeでアクセスできる別の共有フォルダにnet useで接続して、net useをすると2つの共有フォルダに接続されたとでますが、ユーザーを替えて、そのユーザーの接続が許可されている共有フォルダにnet useで接続しようとすると失敗します。また、ユーザー:uketukeが他の共有フォルダにも設定がある場合(特定の設定の仕方と思われます)、net useでは接続できませんが、APIでは接続できます。
サーバーの共有フォルダの設定の仕方により影響があるかもしれないと思い、上記の①〜③は新たなフォルダ、ユーザーを作成し、そのユーザーはそのフォルダだけとしました。
宜しくお願いします。


kazu  2007-12-05 07:19:07  No: 99785

もげ様、訂正します。
切断のDOSコマンド:net use \\MAIN_PC\kyouyuu pas11 /user:uketuke /delleteのdelleteはdeleteの間違いです。
済みませんでした。


kazu  2007-12-05 07:38:00  No: 99786

GOD様、お世話になります。ご指摘にありました「特定部分以外は無視するとなっていますが、他部分に値を入れないようにしてみてはどうでしょうか」ですが、どこまで値をいれなくてよいのかよく分かりません。自分なりにやりましたが、「サーバーが見つかりません」となってしまいました。宜しければ教えて頂けないでしょうか。


GOD  2007-12-05 08:26:24  No: 99787

ユーザー定義型「NETRESOURCE」のメンバ「dwType」「lpLocalName」「lpRemoteName」「lpProvider」以外には値を未設定(初期値)にして見てください。
ただ、net use コマンドで切断ができていないなら上記を試してもダメかもしれません。
あと気になるのはファイアウォールの存在かな。もしどちらかに入っているのならOFFにして実験してみるとか。(外部ネットに繋がないようにサーバーとクライアントをクロスケーブルで接続してね。)


もげ  2007-12-05 18:08:31  No: 99788

NET USEコマンドでの切断は、
net use \\MAIN_PC\kyouyuu /delete
でよかったかと。

NET USEコマンドでダメなら、VBに関係しない話になるので、
以降はネットワーク関係に強い他の掲示板かMicrosoft社のサポートに聞いたほうが
解決に寄与するでしょう。

・NET USEコマンド で確認した際、
\\コンピュータ名\IPC$
の接続がある場合は、これも/deleteで切断してください。
そして再度、接続を試してみてください。

・エラー1219が出たときに、
サーバ側で、
NET SESSIONコマンド
http://ykr414.com/dos/dos03net.html#14
で、そのクライアントからの接続があるかどうか確認してください。
もし接続されていれば、/deleteでサーバ側から切断してください。
そして再度、接続を試してみてください。

なお、
\\コンピュータ名とIPアドレスでそれぞれ接続可能なので、
検証の際には、IPアドレスか\\コンピュータ名どちらか一方に統一して行ってください。

http://www.atmarkit.co.jp/fwin2k/network/baswinlan021/baswinlan021_03.html


kazu  2007-12-06 07:36:52  No: 99789

もげ様、GOD様、お世話になっています。切断のコマンドを  net use \\MAIN_PC\kyouyuu /delete  としましたところきちんと切断できました。接続をAPI、切断をDOSコマンドで行えばなんとかなる見通しが立ちました。プログラム全体を組み立ててみますので、少し時間を頂きたいと思います。日曜日には報告します。


kazu  2007-12-09 05:24:55  No: 99790

もげ様、GOD様、ありがとうございました。
最終的に接続はAPI、切断は「net use」を使用して解決できました。本来APIだけでできるはずと思われますが、APIの使用方法がよく分かっていませんので断念しました。欲を言えば、「net use」ででてくる接続先の中で対象のサーバーに関する接続があった場合は最初にすべて切断するようにしたいのですが、その接続を取り込む方法が分かりません。変数に取り込めれば「net use」で切断できます。
よろしければ、お願いします。


もげ  2007-12-11 00:40:03  No: 99791

NET USE コマンドの結果を取り込むか、
http://homepage2.nifty.com/nihon-nouen/programming-stdinout.htm
こういうことも可能でしょう。

'元ネタは、
'http://www.anchorsystems.co.jp/anchor/ashp/netmon/samples/wmi_os.html#Win32_NetworkConnection.htm
    Dim strComputer As String
    Dim objWMIService As Object
    Dim colItems As Object
    Dim objItem As Object
    
    strComputer = "."
    
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_NetworkConnection", , 48)

    
    For Each objItem In colItems
        Debug.Print "LocalName " & objItem.LocalName
        Debug.Print "RemotePath: " & objItem.RemotePath

    Next


kazu  2007-12-11 08:09:53  No: 99792

もげ様、お世話になります。
職場で試しました。うまく動作していると思っていましたら実は時々、誤動作が発生していました。例えば\\MAIN_PC\MyData\SETUZOKUという共有フォルダにAPIで接続し、Explorerでそこを表示し、"net use \\MAIN_PC\MyData\SETUZOKU /delete/yes" で切断して、その後net useで確認すると\\MAIN_PC\MyDataや\\MAIN_PCの接続が残っているという誤動作が時々発生します。なぜか原因はさっぱり分かりません。
明日、もげ様に教えていただいた接続相手先確認を試します。


kazu  2007-12-11 21:43:33  No: 99793

もげ様、お世話になります。
教えて頂いた方法で、接続前、切断後に接続状況を確認して対象のサーバーの接続が存在する場合は切断するようにしました。全く誤動作なしになりました。
大変ありがとうございました。


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

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






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