ITaskScheduler および ITask インターフェイスを使用して、同じく勤務先の会社によって作成された特定の .exe のタスクを作成および編集する COM+ サーバー コンポーネント (dll) を開発しました。このコンポーネントは従来の ASP ページ (VBScript) から呼び出され、開発中の Office パッケージの一部です。システム全体で Web インターフェイスを使用します。Windows Server 2003/2008 の IIS で実行すると、たとえば ITaskScheduler->Enum を呼び出そうとすると、0x80070005 アクセス拒否エラーが発生します。これは完全に理にかなっています。IUsr_... アカウントはタスク スケジューラにアクセスできないはずです。ユーザーが Web ページで資格情報を入力するためのフィールドを追加し、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 で特定の役割を設定することもできません。ヘルプや提案は大歓迎です。