1

我有以下设置。有一个 Azure Web 角色进程 (WaIISHost.exe) 运行提升,并且有 IIS7 应用程序池在本地用户下运行。本地用户在首次运行时由提升的 WaIISHost.exe 创建。还有一个向 DCOM 注册的进程外 COM 对象。

我想确保 IIS 进程能够实例化 COM 对象。所以我需要以某种方式在本地用户下登录并尝试实例化 COM 对象。

我目前的方法是LogonUser()通过 P/Invoke 调用(请求交互式登录),获取登录令牌,然后启动一个新线程并从该线程调用ImpersonateLoggedOnUser()切换到另一个用户,一旦完成,另一个线程会尝试实例化 COM目的。

一切都很好,除了交互式登录现在默认情况下仅适用于管理员,所以我的方法不再有效 - 我明白了

登录失败:用户在这台计算机上没有被授予请求的登录类型

但是,如果我只是跳过检查 IIS 稍后实例化 COM 对象就好了。

所以我需要更改我的验证码。

一种选择是尝试向用户添加所需的权限(交互式登录),但这是大量的 P/Invoke 代码,而且微软有可能在某个时候更改了其他内容,并且我被禁止完全调整权限。

是否有另一种方法可以验证 COM 对象是否可以在另一个用户帐户下成功实例化?

4

1 回答 1

1

这不是一个通用的答案,但对于这种特定情况来说很好。一种可能的解决方案是在 IIS 中实现一个特殊的 URL,它只接受本地请求(检查HttpRequestBase.IsLocal)并尝试实例化 COM 对象。之前尝试模拟的代码现在将向该 URL 发送 HTTP 请求(在同一台计算机上)。

于 2013-06-24T14:28:29.153 回答