NetApi32.dll メソッドを呼び出していNetUseAdd
ます。
こうやって:
USE_INFO_2 useinfo = new USE_INFO_2();
useinfo.ui2_remote = UNCPath;
useinfo.ui2_username = User;
useinfo.ui2_domainname = Domain;
useinfo.ui2_password = Password;
useinfo.ui2_asg_type = 0;
useinfo.ui2_usecount = 1;
uint paramErrorIndex;
returncode = NetUseAdd(null, 2, ref useinfo, out paramErrorIndex);
これを呼び出すとuseinfo.ui2_remote = \\servername\dirname
コード 67 が返され、これを呼び出すとuseinfo.ui2_remote = \\servername\dirname\
コード 87 が返されます。
コードを返すと言うとき...例外をスローしてMarshal.GetLastWin32Error()
このエラーコードを返すか、実際の呼び出しがそれをNetUseAdd
返すことを意味します。
奇妙なことに、このメソッドは、ダブ フォルダーを持たないパスで呼び出すと成功し、サブフォルダー を持つパスで呼び出すと失敗します。
呼び出し元のマシンは Windows サーバー 2008 で、リモートは Linux サーバーです (どのバージョンまたはディストリビューションかはわかりません)。
サブフォルダーの問題を気にせずに、リモート リソースを正常に接続\使用するにはどうすればよいでしょうか?
編集:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal struct USE_INFO_2
{
internal LPWSTR ui2_local;
internal LPWSTR ui2_remote;
internal LPWSTR ui2_password;
internal DWORD ui2_status;
internal DWORD ui2_asg_type;
internal DWORD ui2_refcount;
internal DWORD ui2_usecount;
internal LPWSTR ui2_username;
internal LPWSTR ui2_domainname;
}
[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern NET_API_STATUS NetUseAdd(
LPWSTR UncServerName,
DWORD Level,
ref USE_INFO_2 Buf,
out DWORD ParmError);
言及する価値のある詳細情報: NetUseAdd を使用して追加しようとしているリモート パスは、巨大なストレージ (7 TB) です。Windows エクスプローラーでの簡単なアクセスでは到達までに 3 ~ 4 秒ほどかかりますが、最終的には表示されます。