我正在尝试从Windows服务连接到远程密码保护的共享文件夹,该服务作为LocalSystem帐户运行。似乎LocalSystem帐户无法使用WNetAddConnection2()或类似的调用直接访问受密码保护的网络共享。 谁能证实这一点? 我已经读过,模仿管理员用户可能就是这样。 我尝试在WNetAddConnection2()之前使用LogonUser()和ImpersonateLoggedOnUser(),看起来网络路径的安装成功,但实际访问(例如,枚举远程文件夹中的文件)失败。 有什么想法吗?
感谢。
答案 0 :(得分:2)
告诉我信任,我只在域环境中工作,没有受密码保护的网络共享,但我知道有两种主要的连接方式:WNetAddConnection2
API和NetUseAdd
API。我建议您尝试使用等级为1(NetUseAdd
)的USE_INFO_1
函数。我只使用USE_INFO_2
ui2_username
,ui2_domainname
和ui2_password
,但USE_INFO_1
只有ui1_password
,因此它看起来像是为连接到受密码保护的共享。
顺便说一句,LogonUser()实际上没有任何意义,因为它在本地计算机上进行本地登录,并且您需要建立与远程计算机的会话。这样做WNetAddConnection2
和NetUseAdd
。
答案 1 :(得分:2)
我刚刚遇到这个问题,并发现如果我将远程计算机名称放入用户名,它就可以了。 (我实际上没有想到这一点,我们在代码中有另一个地方已经做到了这一点,所以我知道这是可能的,最后想出了差异。)
例如:
WNetAddConnection2(&nr, "password", "SomeComputer\\Username", 0);
我没有做任何其他特殊调用,如LogonUser或ImpersonateLoggedOnUser。
这是在SYSTEM帐户下运行的服务中。
我没有尝试使用SomeComputer \ Administrator帐户,但这无论如何都不是一个好习惯。我在SomeComputer上使用普通用户帐户。
答案 2 :(得分:1)
您可以从本地系统帐户(“NT AUTHORITY \ SYSTEM”)访问网络共享的方式:
这里的要点是在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);
备注强>
答案 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)