我开发了一个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中设置特定角色。任何帮助或建议都非常感激。
答案 0 :(得分:0)
解决方法是将Logon和Impersonation逻辑移动到单独的COM对象。在创建Task Scheduling对象的实例并调用它的代码之前,需要在ASP和Logon代码中创建一个这样的实例。这样,模拟逻辑就应用于ASP。即。现在可以看到ASP在模拟帐户下运行。