2012-04-27 2 views
1

ITaskScheduler 및 ITask 인터페이스를 사용하여 내가 작업하는 회사에서 만든 특정 .exe에 대한 작업을 만들고 편집하는 COM + 서버 구성 요소 (dll)를 개발했습니다. 이 구성 요소는 기존 ASP 페이지 (VBScript)에서 호출되며 개발중인 Office 패키지의 일부입니다. 전체 시스템은 웹 인터페이스를 사용합니다. Windows Server 2003/2008에서 IIS를 실행하면 ITaskScheduler-> Enum과 같은 호출을 시도 할 때 0x80070005 액세스 거부 오류가 발생합니다. 이것은 완벽하게 이해할 수 있습니다. 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 개체로 이동하는 것이 었습니다. 이 인스턴스는 작업 예약 개체의 인스턴스를 만들고 코드를 호출하기 전에 호출 된 ASP 및 로그온 코드에서 만들어야합니다. 이 방법은 가장 (impersonation) 논리가 ASP에 적용됩니다. 즉. 이제 ASP가 가장 된 계정으로 실행됩니다.