1

我开发了一个 COM+ 服务器组件 (dll),它使用 ITaskScheduler 和 ITask 接口为我工作的公司创建的特定 .exe 创建和编辑任务。该组件是从经典的 ASP 页面 (VBScript) 调用的,是我们正在开发的办公包的一部分。整个系统使用网络界面。在 Windows Server 2003/2008 上的 IIS 下运行时,尝试调用 ITaskScheduler->Enum 时出现 0x80070005 access denied 错误。这很有意义,IUsr_... 帐户不应该有权访问任务调度程序。我为用户添加了在网页上输入凭据的字段,然后在 COM 对象中调用 LogonUser 和 ImpersonateLoggedOnUser。但是我仍然收到拒绝访问错误。后续调用 IServerSecurity-> QueryBlanket 显示 COM 对象仍在 IUsr_... 帐户下运行。我的登录逻辑如下:

bool SystemUser::LogonUser(const wchar_t* userName, const wchar_t* domain, const wchar_t* password)
{
    if(::LogonUser(userName, domain, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &_token))
    {
        return true;
    }
    System::LogSystemError(__W_FILE__, __W_FUNCTION__, __LINE__, L"Unable to logon user: %s domain: %s", userName, domain);
    return false;
}

bool SystemUser::Impersonate()
{
    if(::ImpersonateLoggedOnUser(_token))
    {
        return true;
    }
    System::LogSystemError(__W_FILE__, __W_FUNCTION__, __LINE__, L"Unable to impersonate user");
    return false;
}

SuccessCode::Enum SystemUser::Logon(const wchar_t* userName, const wchar_t* domain, const wchar_t* password)
{
    if(!_token)
    {
        if(!LogonUser(userName, domain, password) || !Impersonate())
        {
            return SuccessCode::ImpersonateError;
        }
        else
        {
            Global::systemLog.Write(LogLevel::Information, L"Successfully logged on as user: '%s' domain: '%s'", userName, domain);
        }
    }
    return SuccessCode::Success;
}

使用 LOGON32_LOGON_INTERACTIVE 作为登录类型没有区别。在 COM+ MMC 中设置特定角色也不行。非常感谢任何帮助或建议。

4

1 回答 1

0

解决方案是将登录和模拟逻辑移动到单独的 COM 对象。这需要在 ASP 中创建一个实例,并在创建任务调度对象的实例并调用它的代码之前调用登录代码。这样,模拟逻辑就应用于 ASP。IE。现在可以看到 ASP 在模拟帐户下运行。

于 2012-08-15T18:37:22.993 回答