如何在代码中将网络驱动器映射到域

How do I map a network drive on a domain in code

我正在使用此功能映射网络驱动器:

CONST
  MapNetDrvDefFlags     = CONNECT_TEMPORARY OR CONNECT_INTERACTIVE {$IFDEF CONSOLE } OR CONNECT_COMMANDLINE {$ENDIF };

FUNCTION MapNetworkDrive(D : CHAR ; CONST UNC,UserName,Password,Provider : STRING ; Flags : DWORD = MapNetDrvDefFlags) : DWORD;
  VAR
    NetResource : _NETRESOURCEW;
    LocalRes    : STRING;

  BEGIN
    FillChar(NetResource,SizeOf(_NETRESOURCEW),0);
    NetResource.dwType:=RESOURCETYPE_DISK;
    LocalRes:=D+':'; NetResource.lpLocalName:=POINTER(LocalRes);
    NetResource.lpRemoteName:=POINTER(UNC);
    NetResource.lpProvider:=POINTER(Provider);
    Result:=WNetAddConnection2W(NetResource,POINTER(Password),POINTER(UserName),Flags)
  END;

它在标准的 SAMBA WORKGROUP 网络上运行良好。但在客户那里却没有。它 确实 映射驱动器,但是当我尝试访问它时,我收到“无效的用户或密码”错误。

我注意到的一个区别是,如果我执行手动操作

NET USE <Drive>: <UNC>

在我自己的网络 (WORKGROUP) 上,我得到一个简单的用户名提示。但是在客户的网络上,我得到了不同的提示:

Skriv brugernavnet for 'xxxx.yyyy':

(翻译:输入 'xxxx.yyyy' 的用户名)

我假设这是一个域名,但如何将其提供给 WNetAddConnection2W 调用?我已尝试将用户名发送为“xxxx.yyyy@user”,但这不起作用。是否还有其他地方需要我提供域名(如果确实如此)?

我也曾尝试将 xxxx.yyyy 部分指定为 _NETRESOURCEW 结构中的“提供者”,但如果这样做,我会收到“无效提供者”错误。

这是对一个非常相似的问题的回答:

本质上,我认为您应该在 lpRemoteName 中使用域名就可以了。