【问题标题】:Access to a protected network share using Win32 C++使用 Win32 C++ 访问受保护的网络共享
【发布时间】:2014-04-24 14:10:30
【问题描述】:

有没有办法使用 Win32 C++ API 访问受登录名/密码保护的网络共享、列出文件并获取它们的名称和创建日期? 我不希望 samba 网络共享出现在我的资源管理器中。 (这可以通过 WNetAddConnection2 方法完成)。 谢谢大家。

【问题讨论】:

  • 每个会话都维护网络连接。通过CreateProcessAsUser 从您希望无法使用连接的进程中在不同的登录会话中运行您的程序。 (请注意,这与每个会话的驱动器号分配完全不同,而且我相信它与用户帐户是分开的。)
  • 我想知道一种设计需要在应用程序中存储凭据而不让用户访问它们。一旦应用程序在计算机上,应假定它处于任何有权访问应用程序文件的帐户的完全控制之下。

标签: c++ windows winapi


【解决方案1】:

虽然我同意 Ben 在评论中提出的反对意见,但您可以继续使用 WNetAddConnection2。当您为lpLocalName 参数传入NULL 值时,它不会映射驱动器,而只会执行授权,因此允许您使用完整的UNC 路径来执行任务,例如枚举文件远程系统。

lpLocalName:指向以空字符结尾的字符串的指针,该字符串指定要重定向的本地设备的名称,例如“F:”或“LPT1”。字符串以不区分大小写的方式处理。 如果字符串为空或 lpLocalName 为 NULL,则该函数将连接到网络资源而不重定向本地设备。

MSDN 页面几乎提供了使用它的瘦身,但类似于(我手头没有 Windows 框来验证任何此代码是否有效):

NETRESOURCE resource;
resource.dwType = RESOURCETYPE_DISK;
resource.lpLocalName = 0;
resource.lpRemoteName = L"\\\\server\\share";
resource.lpProvider = 0;
DWORD conResult;
DWORD result = WNetAddConnection2(&resource, L"password", L"username", CONNECT_TEMPORARY);
if (result == NO_ERROR) {
    // Go hog wild with files in \\server\share
}

要完成使用它:

DWORD retval = WNetCancelConnection2(L"\\\\server\\share", 0, TRUE);

现在请记住,如果您已经使用不同的凭据与服务器建立了连接,那么我很确定连接会失败

【讨论】:

  • 请注意,已连接的共享仍将显示在 net use 的输出中,并且在连接时可以被同一会话中以同一用户身份运行的任何其他进程访问。
  • @AndrewMedico 从未说过事实并非如此。如果您使用 Windows API,那么您将按照 API 规则进行操作,这些规则表明连接是针对会话的。我不知道有任何 C/C++ 库提供对 samba 共享的访问,而无需为 Windows 进行一些移植工作。
  • 我在尝试 WNetAddConnection2 时有时会收到 ERROR_NO_NETWORK。网络可以访问...
  • 获取ERROR_NO_NETWORK 的原因有多种,其中大多数与名称查找有关(服务器名称由于某些原因无法解析,原因不明)。通过重试,改为使用服务器的 IP 地址,您可能会获得更好的运气。
  • 这个错误是因为我的服务在网络启动之前启动。当我在典型的 Win32 用户应用程序中尝试前面的代码时,它工作正常。但是,当我在服务中使用它时,它不起作用(错误 1312 ERROR_NO_SUCH_LOGON_SESSION)。似乎它在服务中不起作用,因为我发现浏览网页......服务的用户名是 System
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2011-06-07
  • 1970-01-01
  • 2013-08-16
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
相关资源
最近更新 更多