2010-03-23 187 views
11

背景:我有了从文件的网络驱动器上读取(Z :)网络驱动器上访问文件

这工作在我的办公室域伟大的应用程序,但它不工作的网站(在不同的域中)。据我所知,域用户和网络驱动器的设置方式相同,但我无法访问客户域中的用户等。

当我无法访问网络驱动器时,我想我需要一个令牌给用户。这是我impersionate用户:

[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;结束了这个问题。

+3

我敢打赌,超级用户会争论相反(因为这有代码)。 – Codesleuth 2010-03-23 15:45:55

+0

为什么不让执行此代码的帐户对驱动器有读取权限?然后你的代码变成这样:'File.ReadAllBytes(filePath);' – ChaosPandion 2010-03-23 15:47:26

+0

我曾经问过类似的问题;你可能会觉得它很有用:http://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials – Randolpho 2010-03-23 15:47:38

回答

6

的几点思考:

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

将测试UNC路径。不过,我确实觉得你误解了我的域名。在测试环境中有两个独立的域,一个在现场,从不互相通信。用户在双方都在它试图访问的域中。 – 2010-03-25 20:31:04

+0

另外,我不是100%确定我将拥有UNC路径 - 客户系统管理员已经建立了一个域用户,因此我可以拥有映射的网络驱动器。我还可以UNC访问它吗? – 2010-03-26 11:04:57

0

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

相关问题