WNetAddConnection2从Windows服务

我试图从Windows服务连接到远程密码保护的共享文件夹,该服务以LocalSystem帐户运行。 似乎LocalSystem帐户不能使用WNetAddConnection2()或类似的调用直接访问密码保护的networking共享。 任何人都可以确认吗? 我读过模拟pipe理员用户可能是要走的路。 我已经尝试在WNetAddConnection2()之前使用LogonUser()和ImpersonateLoggedOnUser(),看起来networkingpath的安装成功,但实际访问(例如,远程文件夹中的文件枚举)失败。 有任何想法吗?

谢谢。

Solutions Collecting From Web of "WNetAddConnection2从Windows服务"

为了说明我只在域环境下工作的信任,并且没有受密码保护的网络共享,但是我知道有两种主要的连接方式: WNetAddConnection2 API和NetUseAdd API。 我建议您尝试Level等于1( USE_INFO_1 )的NetUseAdd函数。 我只使用了USE_INFO_2 ,它有ui2_usernameui2_domainnameui2_password ,但USE_INFO_1只有ui1_password ,所以它看起来像一个连接到密码保护共享的函数。

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

我刚刚也遇到了这个问题,并发现如果我把远程计算机名称放入用户名,它就起作用了。 (我没有真正弄清楚,我们在代码中已经有了另外一个地方,所以我知道这是可能的,并且最终找到了区别。)

举个例子:

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

我没有做任何其他特殊的电话,如LogonUser或ImpersonateLoggedOnUser。

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

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

我实际上正在处理同样的问题,Flavio,我目前的怀疑是,如果有人以交互方式登录到计算机,它将工作,如果没有人登录,将返回ERROR_NO_SUCH_LOGON_SESSION。 不过,我可能是错的。 更多来。 我已经给出了这个问题,并会回来:)

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

  1. 您需要登录使用一些本地帐户,即使在非域名网络访问网络。 使用“NT AUTHORITY \ NETWORK SERVICE”帐户来获得这个就足够了
  2. 添加网络共享连接并指定其访问凭据:

此处的要点是在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); 

笔记

  • 模拟只为当前线程炒作。
  • 与本地资源,它将作为本地系统,与增加的份额,将在WNetAddConenction2(在这种情况下 – 在SomeComputer上的管理员)指定的远程计算机上的用户工作。
  • 您可以省略在NETRESOURCE中使用驱动器号并通过“\ server \ share \ filename.ext”表示法访问文件
  • 这可能不适用于一些旧的系统(NT / 2000,不知道确切的列表)

从win32netcon导入win32wnet导入RESOURCETYPE_DISK为DISK path =“\ 192.168.1.11 \ Student”win32wnet.WNetAddConnection2(DISK,“R:”,“\ 192.168.1.11 \ Student”,None,“Student”,“pass”,0)