【发布时间】:2018-04-22 04:45:38
【问题描述】:
我正在调用 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 server 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 秒,但最终会出现。
【问题讨论】:
-
显示为
UNCPath赋值的行 -
UNCPath = "\\\\servername\\somedir"; -
paramErrorIndex 的值是多少?当我有一个 \ 作为最后一个字符时,错误是 87 它在我的盒子上返回 2。如果我使用无效凭据,它会返回 67 你的 linux box 域加入了吗?我的 linux 服务器不是,所以我必须输入服务器名作为域。
-
您说的是子文件夹。所以你是说
@"\\server\dir"有效,但@"\\server\dir\subdir"无效?一个奇怪的想法,但你确实说 Linux ...@"\\server\dir/subdir"之类的东西怎么样? -
这些是基本的低级错误代码。 67 = "网络名称错误,87 = "参数无效"。很有可能您正在解决这个问题,因为您的 pinvoke 声明不正确。我们看不到它们。