3

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

谢谢。

4

5 回答 5

3

刚刚也遇到这个问题,发现如果我把远程计算机名放到用户名里面就可以了。(我实际上并没有弄清楚这一点,我们在代码中有另一个地方已经这样做了,所以我知道这是可能的,并最终找出了区别。)

例如:

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

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

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

我没有尝试过使用 SomeComputer\Administrator 帐户,但这并不是一个好的做法。我在 SomeComputer 上使用普通用户帐户。

于 2013-08-15T17:25:04.030 回答
2

为了告诉信任我一直只在域环境中工作并且没有密码保护的网络共享,但我知道建立连接有两种主要方法:WNetAddConnection2API 和NetUseAddAPI。我建议您尝试NetUseAdd使用 Level 等于 1 ( USE_INFO_1) 的函数。我只使用了USE_INFO_2which has ui2_username, ui2_domainnameand ui2_password, but USE_INFO_1has only ui1_password,所以它看起来像是一个用于连接到受密码保护的共享的功能。

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

于 2010-06-03T23:02:46.197 回答
1

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

  1. 您需要使用即使在非域网络中也可以访问网络的本地帐户登录。使用“NT AUTHORITY\NETWORK SERVICE”帐户即可获得此功能
  2. 添加网络共享连接并指定其访问凭据:

这里的要点是在 LogonUser() 调用期间使用LOGON32_LOGON_NEW_CREDENTIALS登录类型(有关详细信息/限制,请参阅 MSDN)。否则在执行 WNetAddConnection2() 时你会得到 ERROR_NO_SUCH_LOGON_SESSION,即使 LogonUser 和模拟成功。


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 上的管理员)。
  • 您可以在 NETRESOURCE 中省略使用驱动器号,并通过“\server\share\filename.ext”表示法访问文件
  • 这可能不适用于某些旧系统(NT/2000,不知道确切列表)
于 2011-04-26T18:49:39.183 回答
0

import win32wnet from win32netcon import RESOURCETYPE_DISK as DISK path="\192.168.1.11\Student" win32wnet.WNetAddConnection2(DISK,"R:","\192.168.1.11\Student",None,"Student","pass",0)

于 2014-05-29T07:11:45.907 回答
0

我现在实际上正在努力解决同样的问题,Flavio,我目前的怀疑是,如果有人以交互方式登录到机器上,它会起作用,如果没有人登录,它将返回 ERROR_NO_SUCH_LOGON_SESSION。不过,我可能是错的。更多即将到来。我已经为这个问题加注了星标,并将回来查看:)

于 2010-06-03T19:39:48.077 回答