15

System.IO私のソフトウェアはファイルに対する複数の操作を処理し、クラスを使用して関連する関数を書き終えました。

ここで、ネットワーク ドライブのサポートを追加する必要があります。マッピングの使用は非常にうまく機能しますDirectory.GetFilesが (少し低く、理由はわかりません) \\192.168.0.10\Shared Folder\MyDrive、. ドライブを使用可能なドライブ文字にマウントし、新しく生成されたパスを使用してからアンマウントする以外に、このタイプのパスを処理する方法はありますか?

4

3 に答える 3

25

UNC パス (で始まる\\) をパスで直接使用できます。ただし、この接続の資格情報を考慮する必要があるため、注意が必要な場合があります。

いくつかのアプローチがあります。

  1. リモート システムが同じドメイン上にあるか、ドメイン間に信頼関係があり、プログラムを実行しているユーザーが適切なアクセス権を持っている場合、それは「正常に機能します」。

  2. net useコマンドを (Windows プログラムを介して)シェルアウトして実行net.exeし、特定のユーザー名とパスワードで接続することができます。アプリケーションだけでなく、ユーザーのセッションで実行されているすべてのプログラムが接続を使用できることに注意してください。完了したら、コマンドを使用し/DELETEて接続を削除します。一般的な構文は次のとおりですnet use \\computername\sharename password /USER:domain\username

  3. P/Invokeを実行して、シェルを実行せずWNetAddConnection2に同じことを実行できます。として NULL を渡すと、ドライブ文字は割り当てられませんが、ユーザー名とパスワードは、UNC パスを介して行われる後続のアクセスに適用されます。この機能を使用して切断できます。net usenet.exelpLocalNameWNetCancelConnection2

  4. フラグに続いて偽装を使用して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
于 2010-02-28T19:34:55.197 に答える
4

あなたが言及したような通常のUNCパスを使用すると、私にとっては完全に機能します。例えば:

string[] dirs = Directory.GetDirectories(@"\\192.168.1.116\");

うまく動作します。そうでない場合は、セキュリティの問題か何かがある可能性があります。その場合、それを回避するにはなりすましを調べる必要があります。なりすましの詳細については、こちらを確認してください。

于 2010-02-28T19:03:00.070 に答える
1

あなたが投稿した UNC パス ( \\192.168.0.10\Shared Folder\MyDrive) は奇妙です。「ドライブ」はありません。そのような共有はディレクトリとして動作します。を使用しますDirectory.GetFiles(@"\\192.168.0.10\Shared Folder")

于 2010-02-28T19:14:06.317 に答える