【问题标题】:Accessing a file on a network drive访问网络驱动器上的文件
【发布时间】:2010-03-23 15:40:22
【问题描述】:

背景:我有一个应用程序必须读取网络驱动器 (Z:) 上的文件

这在我的办公室域中效果很好,但在现场(在不同的域中)不起作用。据我所知,域用户和网络驱动器的设置方式相同,但是我无权访问客户域中的用户等。

当我无法访问网络驱动器时,我想我需要一个用户令牌。这就是我模仿用户的方式:

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

...

const string userName = "USER";
const string pass = "PASS";
const string domainName = "VALIDDOMAIN.local"  //tried with valid domain name and with null, same result
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;

IntPtr tokenHandle = new IntPtr(0);

bool returnValue = LogonUser(userName, domainName, pass,
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
            ref tokenHandle);

if (!returnValue)
    throw new Exception("Logon failed.");

WindowsImpersonationContext impersonatedUser = null;
try
{
    WindowsIdentity wid = new WindowsIdentity(tokenHandle);
    impersonatedUser = wid.Impersonate();

}
finally
{
    if (impersonatedUser != null) impersonatedUser.Undo();
}

现在是有趣/奇怪的部分。在我的网络中,应用程序已经可以访问网络驱动器,如果我尝试模拟活动用户(完全相同的用户,包括相同的域),它将无法访问网络驱动器。

这让我很无助,因为现在我不知道什么有效,什么无效,更重要的是,它会在现场有效吗?

我错过了什么?

编辑:我在最初问这个问题时忘记写这个:我尝试输入一个有效的域名但它不起作用,所以之后我尝试输入 null 以获得相同的用户名就像我没有这个代码一样(因为它在我们的域中默认工作)。这没有帮助,这就是 domain = null;结束了这个问题。

【问题讨论】:

  • 我敢打赌超级用户会反对(因为这有代码)。
  • 为什么不授予执行此代码的帐户对驱动器的读取权限?然后你的代码变成这样:File.ReadAllBytes(filePath);
  • 我曾经问过类似的问题;您可能会发现它很有用:stackoverflow.com/questions/659013/…
  • @Codesleuth:我发表评论时它没有代码。检查时间戳。

标签: c# network-drive


【解决方案1】:

一些想法:

  • 不要使用逻辑驱动器路径从代码访问网络资源。始终使用 UNC 路径(例如 \\SERVER\Share\Filename.ext)。
  • 从您的本地安全策略启用对登录/注销事件的审核,以便在您调用 Impersonate 方法时,可以非常详细地跟踪失败/成功
  • 您最好在自己的域中创建一个帐户,该帐户与其他域中的帐户具有相同的用户名和密码。对您的域进行身份验证,传递身份验证将使您能够访问其他域上的网络共享。

【讨论】:

  • 将测试 UNC 路径。但是,我确实觉得您误解了我对域名的看法。测试环境中有两个独立的域,一个在站点上,从不相互通信。在双方,用户都在它试图访问的域中。
  • 另外,我不能 100% 确定我会拥有 UNC 路径 - 客户系统管理员已经设置了域用户,因此我可以拥有映射的网络驱动器。我仍然可以通过 UNC 访问它吗?
【解决方案2】:

这听起来可能很愚蠢,但您是否尝试过更改访问驱动器的方式? 也许安装某种形式的虚拟处理程序,让您查看驱动器上的信息。比如SSH?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多