1

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 で特定の役割を設定することもできません。ヘルプや提案は大歓迎です。

4

1 に答える 1

0

これに対する解決策は、ログオンと偽装のロジックを別の COM オブジェクトに移動することでした。このインスタンスは、タスク スケジューリング オブジェクトのインスタンスを作成してそのコードを呼び出す前に、ASP で作成し、Logon コードを呼び出す必要があります。このようにして、偽装ロジックが ASP に適用されます。すなわち。ASP が偽装されたアカウントで実行されていることがわかります。

于 2012-08-15T18:37:22.993 に答える