我開發了一個COM +服務器組件(dll),它使用ITaskScheduler和ITask接口來創建和編輯由我工作的公司創建的特定.exe任務。該組件是從傳統的ASP頁面(VBScript)調用的,並且是我們正在開發的辦公軟件包的一部分。整個系統使用Web界面。在Windows Server 2003/2008的IIS下運行時,嘗試調用時出現0x80070005訪問被拒絕錯誤,例如ITaskScheduler-> Enum。這非常合理,IUsr _...帳戶不應該有權訪問任務計劃程序。我添加了一些字段供用戶在網頁上輸入憑據,然後調用LogonUser,然後調用COM對象中的ImpersonateLoggedOnUser。但是我仍然遇到訪問被拒絕的錯誤。隨後對IServerSecurity-> QueryBlanket的調用顯示COM對象仍在IUsr _...帳戶下運行。我的登錄邏輯如下:經典ASP和ITaskScheduler訪問被拒絕錯誤
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中也沒有設置特定的角色。任何幫助或建議非常感謝。