访问网络驱动器上的文件

时间:2010-03-23 15:40:22

标签: c# network-drive

后台:我有一个必须从网络驱动器上的文件读取的应用程序(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;结束了这个问题。

2 个答案:

答案 0 :(得分:7)

一些想法:

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

答案 1 :(得分:0)

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