NetUseAdd返回错误67或87

时间:2013-07-21 10:45:00

标签: c# winapi

我正在调用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秒才能到达,但最终会出现。

4 个答案:

答案 0 :(得分:4)

我不是这方面的专家,但我使用的是:

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

我收到错误代码87, 然后我把字符串改为

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

它有效。也许,它可能适用于其他人。

答案 1 :(得分:1)

我遇到了同样的问题,并设法找出罪魁祸首 - 如果使用Original Article的源代码,我注意到它只允许我在不以管理员身份运行visual studio时进行连接(我的默认设置) )。希望这有助于其他人对此感到沮丧!

答案 2 :(得分:0)

我遇到了与Linux服务器连接的类似问题。对我有用的解决方案是首先使用登录凭据手动从Windows映射网络驱动器,这必须创建一些内部配置,然后允许使用NetUseAdd进行连接。我只需要将驱动器映射一次。

答案 3 :(得分:0)

我发现文件夹路径区分大小写,因为路径中应该没有尾部反斜杠,如前所述。

我改变它后它起作用了。