
ネットワーク上の共有フォルダや同じドメインのコンピュータのフォルダにアクセスする際、認証をユーザーに任せたい場合があります。
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
初めて接続する場合、以下のようなダイアログが表示されます。

以下、ソース説明。
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の場合、ユーザーに関連付けられた既定のパスワードを使用します。
認証に失敗した場合、dwFlagsにCONNECT_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以外のオプションは使ったことがないです。
戻り値
成功すると「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 件のコメント :
コメントを投稿