UNC パス (で始まる\\
) をパスで直接使用できます。ただし、この接続の資格情報を考慮する必要があるため、注意が必要な場合があります。
いくつかのアプローチがあります。
リモート システムが同じドメイン上にあるか、ドメイン間に信頼関係があり、プログラムを実行しているユーザーが適切なアクセス権を持っている場合、それは「正常に機能します」。
net use
コマンドを (Windows プログラムを介して)シェルアウトして実行net.exe
し、特定のユーザー名とパスワードで接続することができます。アプリケーションだけでなく、ユーザーのセッションで実行されているすべてのプログラムが接続を使用できることに注意してください。完了したら、コマンドを使用し/DELETE
て接続を削除します。一般的な構文は次のとおりですnet use \\computername\sharename password /USER:domain\username
。
P/Invokeを実行して、シェルを実行せずWNetAddConnection2
に同じことを実行できます。として NULL を渡すと、ドライブ文字は割り当てられませんが、ユーザー名とパスワードは、UNC パスを介して行われる後続のアクセスに適用されます。この機能を使用して切断できます。net use
net.exe
lpLocalName
WNetCancelConnection2
フラグに続いて偽装を使用してP/InvokeLogonUser
を実行LOGON32_LOGON_NEW_CREDENTIALS
し、スレッドに追加のリモート資格情報を追加できます。#2 と #3 とは異なり、ユーザーのセッション全体への影響はもう少し制限されます。(実際には、よく知られている解決策を支持してこれが行われることはめったにありませんWNetAddConnection2
。)
WNetAddConnection2
以下はVB.NETからの呼び出し方のサンプルです。
Private Sub Test()
Dim nr As New NETRESOURCE
nr.dwType = RESOURCETYPE_DISK
nr.lpRemoteName = "\\computer\share"
If WNetAddConnection2(nr, "password", "user", 0) <> NO_ERROR Then
Throw New Exception("WNetAddConnection2 failed.")
End If
'Code to use connection here.'
If WNetCancelConnection2("\\computer\share", 0, True) <> NO_ERROR Then
Throw New Exception("WNetCancelConnection2 failed.")
End If
End Sub
<StructLayout(LayoutKind.Sequential)> _
Private Structure NETRESOURCE
Public dwScope As UInteger
Public dwType As UInteger
Public dwDisplayType As UInteger
Public dwUsage As UInteger
<MarshalAs(UnmanagedType.LPTStr)> _
Public lpLocalName As String
<MarshalAs(UnmanagedType.LPTStr)> _
Public lpRemoteName As String
<MarshalAs(UnmanagedType.LPTStr)> _
Public lpComment As String
<MarshalAs(UnmanagedType.LPTStr)> _
Public lpProvider As String
End Structure
Private Const NO_ERROR As UInteger = 0
Private Const RESOURCETYPE_DISK As UInteger = 1
<DllImport("mpr.dll", CharSet:=CharSet.Auto)> _
Private Shared Function WNetAddConnection2(ByRef lpNetResource As NETRESOURCE, <[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpPassword As String, <[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpUserName As String, ByVal dwFlags As UInteger) As UInteger
End Function
<DllImport("mpr.dll", CharSet:=CharSet.Auto)> _
Private Shared Function WNetCancelConnection2(<[In](), MarshalAs(UnmanagedType.LPTStr)> ByVal lpName As String, ByVal dwFlags As UInteger, <MarshalAs(UnmanagedType.Bool)> ByVal fForce As Boolean) As UInteger
End Function