3

我在互联网上的某个地方发现了这个问题,现在面临同样的问题。几乎没有变化,我已经在下面修改了问题。

问题:

我想访问远程机器(10.10.20.30)上的文件,但我不明白如何在我的程序中登录到该机器。是否有任何简单的win api可以获取网络路径、凭据并返回文件句柄?我只想访问\10.10.20.30\share 文件夹\test.txt。任何建议都会有所帮助。

很抱歉在编码意义上不是很清楚。详细信息:我想访问共享文件夹中共享的文件,但未授予我权限。我正在使用::CreateFile来获取文件的句柄。但在这种情况下,我收到错误代码 5 (ACCESS_DENIED)。我需要使用用户(我的客户)凭据(用户名密码)来访问共享的文件。我只需要文件句柄。告诉我如果我错了 ::CreateFile 在这种情况下不能通过使用或修改 MSDN 所说的安全属性来使用。CreateFile 在打开现有文件时忽略 lpSecurityDescriptor 成员。我也想过使用 Window shell,但无法解决。

问题详情 *好吧,远程机器上的要求是这样的,我没有EveryOne权限。让我通过一个例子来解释。假设有某个域的网络至少有 3 台计算机让我们说 5。现在名称是 C1(客户端),C2(目标),C3,C4,C5。现在在这种情况下,我将在 C2 机器上创建一个文件(任何类型)并将其放在一个文件夹中,比如 MyFolder。现在让它共享,然后从中删除 EveryOne。之后添加 C5 作为访问它的用户。现在您可以看到仅使用 ::CreateFile 实现编写一些代码并在机器 C1(客户端)和 C5(它具有权限)上运行它。您将看到客户端(C1)将收到错误 5,这意味着 ACCESS_DENIED 但 C5 将执行它并获取文件句柄......现在我再次重复我的问题,我需要通过我的任何方式获取文件句柄用户名和密码,

请建议我提前谢谢

::CreateFile Fails with Access denied is shell 编程或其他解决方案或提示

4

2 回答 2

2

如果您的应用程序没有在具有足够权限来访问文件的用户帐户下运行,那么您将不得不临时模拟具有访问权限的用户。用于LogonUser()登录所需的用户帐户并为其获取令牌,然后将该令牌传递ImpersonateLoggedOnUser()给以模拟该用户,然后调用CreateFile()(将使用模拟权限)并根据需要使用该文件,然后关闭该文件并RevertToSelf()调用停止冒充。

于 2013-09-24T19:00:02.573 回答
1

CreateFile失败时,ERROR_ACCESS_DENIED这意味着调用的进程CreateFile在没有足够权限执行该操作的用户帐户下运行。

您通过以下方式解决问题:

  1. 授予该用户足够的权限。
  2. 在具有足够权限的不同用户帐户下运行该进程。或者使用模拟来调用CreateFile不同的用户令牌。
  3. 保护有问题的文件,以便原始低权限用户有权执行操作。

这里的底线是,再多的编码都不会帮助你。这个问题全都与相关文件系统对象的安全性有关。这是一个管理问题,而不是编程问题。

于 2013-09-24T08:06:32.933 回答