2012-04-27 66 views
1

我開發了一個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中也沒有設置特定的角色。任何幫助或建議非常感謝。

回答

0

解決方案是將登錄和模擬邏輯移動到單獨的COM對象。在創建Task Scheduling對象實例並調用它的代碼之前,需要在ASP和Logon代碼中創建此實例。這樣模擬邏輯就應用於ASP。即。 ASP現在被看作是在模擬帳戶下運行。