我正在尝试在 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 位置时。
我没有想法:)