来自Windows服务的WNetAddConnection2

时间:2010-06-03 17:41:38

标签: windows service unc

我正在尝试从Windows服务连接到远程密码保护的共享文件夹,该服务作为LocalSystem帐户运行。似乎LocalSystem帐户无法使用WNetAddConnection2()或类似的调用直接访问受密码保护的网络共享。 谁能证实这一点? 我已经读过,模仿管理员用户可能就是这样。 我尝试在WNetAddConnection2()之前使用LogonUser()和ImpersonateLoggedOnUser(),看起来网络路径的安装成功,但实际访问(例如,枚举远程文件夹中的文件)失败。 有什么想法吗?

感谢。

5 个答案:

答案 0 :(得分:2)

告诉我信任,我只在域环境中工作,没有受密码保护的网络共享,但我知道有两种主要的连接方式:WNetAddConnection2 API和NetUseAdd API。我建议您尝试使用等级为1(NetUseAdd)的USE_INFO_1函数。我只使用USE_INFO_2 ui2_usernameui2_domainnameui2_password,但USE_INFO_1只有ui1_password,因此它看起来像是为连接到受密码保护的共享。

顺便说一句,LogonUser()实际上没有任何意义,因为它在本地计算机上进行本地登录,并且您需要建立与远程计算机的会话。这样做WNetAddConnection2NetUseAdd

答案 1 :(得分:2)

我刚刚遇到这个问题,并发现如果我将远程计算机名称放入用户名,它就可以了。 (我实际上没有想到这一点,我们在代码中有另一个地方已经做到了这一点,所以我知道这是可能的,最后想出了差异。)

例如:

WNetAddConnection2(&nr, "password", "SomeComputer\\Username", 0);

我没有做任何其他特殊调用,如LogonUser或ImpersonateLoggedOnUser。

这是在SYSTEM帐户下运行的服务中。

我没有尝试使用SomeComputer \ Administrator帐户,但这无论如何都不是一个好习惯。我在SomeComputer上使用普通用户帐户。

答案 2 :(得分:1)

您可以从本地系统帐户(“NT AUTHORITY \ SYSTEM”)访问网络共享的方式:

  1. 您需要使用一些可以访问netowork的本地帐户登录,即使在非域网中也是如此。使用“NT AUTHORITY \ NETWORK SERVICE”帐户来获取此
  2. 就足够了
  3. 添加网络共享连接并指定其访问凭据:
  4. 这里的要点是在LogonUser()调用期间使用 LOGON32_LOGON_NEW_CREDENTIALS 登录类型(有关详细信息/限制,请参阅MSDN)。否则,即使LogonUser和模拟成功,你也会在执行WNetAddConnection2()时获得ERROR_NO_SUCH_LOGON_SESSION。

    
    LogonUser("NETWORK SERVICE", "NT AUTHORITY", NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken );
    ImpersonateLoggedOnUser(hToken);
    NETRESOURCE nr;
    nr.dwScope = RESOURCE_GLOBALNET;
    nr.dwType = RESOURCETYPE_DISK;
    nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
    nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
    nr.lpRemoteName = "\\\\SomeCopmuter\\C$";
    nr.lpLocalName = "Z:";
    WNetAddConnection2(&nr, "password", "Administrator", 0);
    

    备注

    • 模拟仅适用于当前线程。
    • 使用本地资源,它将作为LocalSystem工作,添加的共享将作为WNetAddConenction2中指定的远程计算机上的用户(在本例中为SomeComputer上的Administrator)。
    • 您可以省略在NETRESOURCE中使用驱动器号并通过“\ server \ share \ filename.ext”表示法访问文件
    • 这可能不适用于某些旧系统(NT / 2000,不知道确切列表)

答案 3 :(得分:0)

我现在正在努力解决同样的问题,Flavio,我当前的怀疑是,如果有人以交互方式登录到计算机,它将起作用,并且如果没有人登录则返回ERROR_NO_SUCH_LOGON_SESSION。不过我可能错了。更多来。我已经主演了这个问题,并会回来查看:)

答案 4 :(得分:0)

从win32netcon导入win32wnet导入RESOURCETYPE_DISK作为DISK路径=" \ 192.168.1.11 \ Student" win32wnet.WNetAddConnection2(DISK," R:"" \ 192.168.1.11 \学生",无,"学生""通过" ,0)