【问题标题】:Impersonating domain user in WPF - UnauthorizedAccess在 WPF 中模拟域用户 - UnauthorizedAccess
【发布时间】:2010-10-25 07:28:17
【问题描述】:

我正在尝试在 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 位置时未授权访问。

我没有想法:)

【问题讨论】:

    标签: wpf networking impersonation unauthorized


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 Vadmyst,感谢您的建议!我已经尝试了 LOGON32_LOGON_NETWORK 标志和 LOGON32_LOGON_NETWORK_CLEARTEXT 标志,两者都导致相同的行为,未经授权的访问。我尝试访问的服务器上的审核确实显示了我正在使用的域帐户的成功登录/注销事件。如果我使用域帐户凭据映射网络文件夹,我可以完全控制该文件夹,读/写 ...
    猜你喜欢
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2018-10-07
    • 2012-10-09
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多