经典ASP和ITaskScheduler访问被拒绝错误

时间:2012-04-27 02:10:06

标签: c++ com asp-classic scheduled-tasks impersonation

我开发了一个COM +服务器组件(dll),它使用ITaskScheduler和ITask接口来创建和编辑由我工作的公司创建的特定.exe的任务。该组件是从经典ASP页面(VBScript)调用的,是我们正在开发的办公软件包的一部分。整个系统使用Web界面。当在Windows Server 2003/2008上的IIS下运行时,在尝试调用时,我得到0x80070005访问被拒绝错误,例如,ITaskScheduler-> Enum。这很有道理,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中设置特定角色。任何帮助或建议都非常感激。

1 个答案:

答案 0 :(得分:0)

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