3

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 秒ほどかかりますが、最終的には表示されます。

4

4 に答える 4

6

私はこのトピックの専門家ではありませんが、次のようなものを使用していました:

@"\\10.22.15.14\C$\Inetpub\wwwroot\db\archive\"

エラーコード87が表示されたので、文字列を次のように変更しました

@"\\10.22.15.14\C$\Inetpub\wwwroot\db\archive"

そしてそれはうまくいきました。おそらく、それは他の誰かのために働くかもしれません。

于 2015-01-05T21:57:07.017 に答える
1

私はこれと同じ問題を抱えていて、犯人を見つけることができました.元の記事のソースコードを使用すると、Visual Studioを管理者として実行していない場合にのみ接続できることに気付きました(私のデフォルト設定). これが他の誰かがこれに不満を感じるのを助けることを願っています!

于 2015-09-06T22:21:50.027 に答える
0

Linux サーバーへの接続で同様の問題が発生していました。私にとってうまくいった解決策は、最初にログイン資格情報を使用して手動で Windows からネットワーク ドライブをマップすることでした。これにより、NetUseAdd を使用して接続を許可する内部構成を作成する必要があります。ドライブを一度だけマップする必要がありました。

于 2016-10-05T13:46:09.850 に答える