我开发了一个 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 中设置特定角色也不行。非常感谢任何帮助或建议。