【VB.NET】ネットワーク上のフォルダにアクセスしてユーザー/パスワード認証のダイアログを表示する

WNetAddConnection2
ネットワーク上の共有フォルダや同じドメインのコンピュータのフォルダにアクセスする際、認証をユーザーに任せたい場合があります。

VB.NETではWindows API の「WNetAddConnection2」を使用してネットワーク接続を行います。

WNetAddConnection2を使用したネットワーク接続サンプル

以下、サンプルソースです。
Private Const RESOURCETYPE_ANY As Integer = &H0
Private Const CONNECT_INTERACTIVE As Integer = &H8

''ネットワークリソース情報の構造体
Private Structure NETRESOURCE
    Dim dwScope As Integer 
    Dim dwType As Integer
    Dim dwDisplayType As Integer 
    Dim dwUsage As Integer 
    Dim lpLocalName As String
    Dim lpRemoteName As String
    Dim lpComment As String
    Dim lpProvider As String
End Structure


''WNetAddConnection2のDeclare宣言
Private Declare Function WNetAddConnection2 _
    Lib "mpr.dll" Alias "WNetAddConnection2A" (
         ByRef lpNetResource As NETRESOURCE _
         , ByVal lpPassword As String _
         , ByVal lpUserName As String _
         , ByVal dwFlags As Long) As Integer


''ネットワークフォルダアクセス
Private Sub NetAddConnect()
    Dim stNETRESOURCE As NETRESOURCE = Nothing
    With stNETRESOURCE
        .dwType = RESOURCETYPE_ANY
        .lpLocalName = Nothing
        .lpRemoteName = "\\piyo\c$"
        .lpProvider = Nothing
    End With

    Dim iRet As Integer
    iRet = WNetAddConnection2(stNETRESOURCE _
                            , Nothing _
                            , Nothing _
                            , CONNECT_INTERACTIVE)
    If iRet <> 0 Then
        MsgBox("error")
    End If
End Sub

初めて接続する場合、以下のようなダイアログが表示されます。
dialog

以下、ソース説明。


NETRESOURCE構造体

ネットワークリソースに関する情報を格納する構造体です。

WNetAddConnection2関数では、「dwType」、「lpLocalName」、「lpRemoteName」、「lpProvider」しか使用しません。

他のメンバは無視されるようです。

dwType

接続先のネットワークリソースのタイプ。

それぞれの値は「Winnetwk.h」に定義されています。
(パスはC:\Program Files(x86)\Microsoft SDKs\Windowsのどこか)
定義 説明
RESOURCETYPE_ANY &H0 すべてのリソース
RESOURCETYPE_DISK &H1 ディスクリソース
RESOURCETYPE_PRINT &H2 リソースを印刷

lpLocalName

"F:"や "LPT1"のように、リダイレクトするローカルデバイスの名前を指定する文字列。
大文字と小文字は区別されない。
デバイスを使用しない接続の場合は何も指定しない。

lpRemoteName

接続先のネットワークリソースを表す文字列
「\\192.168.1.1\share」など。

lpProvider

リソースを所有するプロバイダの名前。プロバイダ名が不明な場合は何も指定しない。


WNetAddConnection2関数

類似した関数に、「WNetAddConnection3」もありますが、正直違いはよくわかりません。
WNetAddConnection2で十分な気がします。

第2引数、第3引数をNothingとして、dwFlagsにCONNECT_INTERACTIVEを指定することでダイアログが表示されます。

パラメータは以下の通り。

第1引数:lpNetResource

NETRESOURCE構造体

第2引数:lpPassword

認証パスワード。
NULLの場合、ユーザーに関連付けられた既定のパスワードを使用します。
認証に失敗した場合、dwFlagsCONNECT_INTERACTIVEが設定されていると、パスワード入力のダイアログが表示されます。

第3引数:lpUsername

認証ユーザー名。
NULLの場合、デフォルトのユーザー名を使用します。

第4引数:dwFlags

接続オプション。
それぞれの値は「Winnetwk.h」に定義されています。
定義 説明
CONNECT_UPDATE_PROFILE &H1 ネットワークリソースの接続を記憶
CONNECT_UPDATE_RECENT &H2 最近の接続リストに追加
CONNECT_TEMPORARY &H4 ネットワークリソース接続は記憶されません
CONNECT_INTERACTIVE &H8 認証の目的でユーザーと対話
CONNECT_PROMPT &H10 ユーザー名、パスワードのデフォルト設定を使用しない
CONNECT_REDIRECT &H80 接続を行うときにローカルデバイスのリダイレクトを強制
CONNECT_CURRENT_MEDIA &H200 新しいメディアを使用して接続を確立しない
CONNECT_COMMANDLINE &H800 コマンドラインを使用して認証
CONNECT_CMD_SAVECRED &H1000 資格情報マネージャーによって保存する必要あり
CONNECT_CRED_RESET &H2000 信任状マネージャーによってリセット
認証ダイアログを表示したい場合は「CONNECT_INTERACTIVE」を指定します。
CONNECT_INTERACTIVE以外のオプションは使ったことがないです。

戻り値

成功すると「0」となります。
失敗した場合、システムエラーコードのいずれかが返ります。
定義 説明
ERROR_ACCESS_DENIED 5 アクセスが拒否されました。
ERROR_ALREADY_ASSIGNED 85 ローカルデバイス名は既に使用されています。
ERROR_BAD_DEV_TYPE 66 ネットワーク リソースの種類が正しくありません。
ERROR_BAD_DEVICE 1200 指定されたデバイス名は無効です。
ERROR_BAD_NET_NAME 67 ネットワーク名が見つかりません。
ERROR_BAD_PROFILE 1206 ユーザープロファイルの形式が正しくありません。
ERROR_BAD_PROVIDER 1204 指定されたネットワーク プロバイダー名は無効です。
ERROR_BAD_USERNAME 2202 指定されたユーザー名は無効です。
ERROR_BUSY 170 要求されたリソースは使用中です。
ERROR_CANCELLED 1223 この操作はユーザーによって取り消されました。
ERROR_CANNOT_OPEN_PROFILE 1205 永続的な接続を処理するためにユーザープロファイルを開くことができません。
ERROR_DEVICE_ALREADY_REMEMBERED 1202 ローカルデバイス名には、別のネットワークリソースへの接続が記憶されています。
ERROR_EXTENDED_ERROR 1208 ネットワーク固有のエラーが発生しました。
ERROR_INVALID_ADDRESS 487 無効なアドレスにアクセスしようとしました。
ERROR_INVALID_PARAMETER 87 パラメータが正しくありません。
ERROR_INVALID_PASSWORD 86 指定されたパスワードは無効です。
ERROR_LOGON_FAILURE 1326 ユーザー名またはパスワードが正しくありません。
ERROR_NO_NET_OR_BAD_PATH 1203 指定されたネットワークパスを受け入れたネットワークプロバイダはありません。
ERROR_NO_NETWORK 1222 ネットワークは利用できません。

以上。

<スポンサーリンク>


0 件のコメント :

コメントを投稿