在WPF中模仿域用户 - UnauthorizedAccess

时间:2009-05-11 14:52:19

标签: wpf networking impersonation unauthorized

我正在尝试在WPF应用程序中模拟域用户帐户,以便应用程序可以写入网络上的文件夹。域用户有足够的权限写入此位置。 我正在使用net上的一些代码来执行模拟。

基本上,它调用返回安全令牌的本机LogonUser方法,然后创建一个新的WindowsIdentity传递令牌并最终调用windowsIdentity.Impersonate()方法。 我没有在逻辑上执行任何异常。

调用WindowsIdentity.GetCurrent() - >返回冒充身份。

写入UNC路径 - > UnauthorizedAccess异常。

因此,我在尝试编写文件之前检查Thread.CurrentPrincipal对象,它有一个GenericPrincipal,而不是带有模拟WindowsIdentity的WindowsPrincipal。

因此,在应用程序启动时,我将AppDomain.CurrentAppDomain.SetPrincipalPolicy设置为PrincipalPolicy.Impersonate。

我重启了我的申请......

在我打电话给模仿之前,我可以在Thread.CurrentPrincipal上看到我自己的凭据,我用来登录我的开发机器,以及正在执行我的WPF程序。

我再次尝试运行模拟逻辑,再次看到WindowsIdentity.GetCurrent上的模拟身份,一切似乎都没问题,没有例外

然而,在Thread.GetCurrentPrincipal上,我仍然看到自己的凭据,如果我查看AuthenticationType属性,则会出现UnauthorizedException(仅在调试器中可见,它不会被应用程序抛出!!)。我让代码运行。

再次尝试在UNC位置写入我的文件时,UnauthorizedAccess。

我尝试的最后一件事是使用WindowsIdentity.GetCurrent()创建一个新的WindowsPrincipal 我在Thread.Current上显式设置它,但结果相同。

写入UNC位置时,

UnauthorizedAccess。

我没有想法:)

1 个答案:

答案 0 :(得分:0)

具有网络共享的计算机是否属于域? 您是否尝试使用该域帐户访问网络共享?例如,使用“Run As ...”。

在LogonUser函数中尝试登录时使用LOGON32_LOGON_NETWORK标志。 另外,要查看是否实际发生了模拟,请尝试启用安全策略(info link)中的登录/注销事件审核