2

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

基本上,它调用返回安全令牌的本机 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(仅在调试器中可见,不会在应用程序中抛出!!)。我让代码运行。

同样,UnauthorizedAccess 在尝试将我的文件写入 UNC 位置时。

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

UnauthorizedAccess 写入 UNC 位置时。

我没有想法:)

4

1 回答 1

0

具有网络共享的机器是否在域中?您是否尝试使用该域帐户访问网络共享?例如使用“运行方式...”。

在 LogonUser 函数中,在登录时尝试使用 LOGON32_LOGON_NETWORK 标志。还要查看是否确实发生了模拟,请尝试从安全策略(信息链接)中启用对登录/注销事件的审核

于 2009-05-12T07:24:12.503 回答