2

StartType = stSystem の Windows サービスがあります。

CreateProcessWithLogonW でアプリケーションを実行します。

 usr := 'myuser';
 dmn := 'mydomain';
 pwd := 'thepassword';
 cmd := 'c:\myapp.exe -calculate';
 wdir := 'c:\';

 fillchar(si, sizeof(si), 0);
 si.cb := sizeof(si);

 if not CreateProcessWithLogon(
           PWideChar(usr),
           PWideCharOf(dmn),
           PWideChar(pwd),
           LOGON_WITH_PROFILE,
           nil,
           PWideChar(cmd),
           NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE or CREATE_NEW_PROCESS_GROUP,
           nil,
           PWideChar(wdir),
           si,
           pi
         )
        then
          RaiseLastOSError; // raises Code 5: Access Denied

このコードをサービスの外で実行すると、すべてうまくいきます!

CreateProcessWithLogon でシステム エラー Code 5: Access Denied が発生するのはなぜですか?


これが原因でしょうか?

CreateProcessWithLogonW に関する MSDN の記事は次のように述べています。

Windows XP SP2 および Windows Server 2003: 関数は呼び出し元トークンでログオン SID を使用し、LocalSystem アカウントのトークンにはこの SID が含まれていないため、LocalSystem アカウントで実行されているプロセスから CreateProcessWithLogonW を呼び出すことはできません。別の方法として、CreateProcessAsUser および LogonUser 関数を使用します。

Windows 7 PRO x64 を使用しています

4

2 に答える 2

3

LocalSystemアカウントでサービスを実行しており、ドキュメントに明確に記載されているとおりです。

関数は呼び出し元トークンでログオン SID を使用し、LocalSystem アカウントのトークンにはこの SID が含まれていないため、 LocalSystemアカウントで実行されているプロセスから CreateProcessWithLogonW を呼び出すことはできません。

そのため、サービスが実行されているユーザー アカウントを変更するかCreateProcessAsUser()、ドキュメントに記載されているように に切り替えます。

于 2012-11-30T22:38:40.813 に答える
0

LocalSystem アカウントには、ローカル システム上の任意のプログラムを読み取り、実行するための十分な権限が必要です (何かへのアクセスを拒否するという特別な問題が発生した場合を除きます)。それを考えると、おそらくあなたが実行しているプログラムは他のコンピューターにあると思います。これが失敗の原因となる理由は、LocalSystem にはネットワーク ID がなく、一般にリモート共有にアクセスできないためです。プログラムがネットワーク共有 (マップされたドライブによってマスクされる可能性がある) ではなく、ローカル ドライブに確実に存在することを確認できますか?

それが問題でない場合は、ProcMonを使用して問題をデバッグしてみます。これにより、アクセスの成功と失敗を含め、システム上のすべてのファイルとレジストリのアクティビティが表示されます。これを実行して問題を再現すると、ACCESS DENIED という結果のエントリが表示され、原因がわかるはずです。フィルタリング機能を使用して、出力をサービス プロセスと作成中のプロセスに制限できます。Vista/2008 以降で実行している場合は、昇格された権限で ProcMon を実行する必要があります。

また、Windows イベント ログ、特にセキュリティ ログを確認することもできます。監査ログが有効になっていない場合は、有効にする必要がある場合があります。「オブジェクト アクセスの監査」、「ログオン イベントの監査」、「アカウント ログオン イベントの監査」、および「特権の使用の監査」を、成功と失敗を含めて有効にします。私の経験では、これらの変更が有効になるまでに少し時間がかかる可能性があるため、ログが表示されない場合は、テスト システムを再起動することをお勧めします。ログが機能するようになったら、CreateProcessWithLogon を再試行し、どのようなイベントが表示されるかを確認します。また、うまくいったときに生成される一連のイベントと、うまくいかないときに生成される一連のイベントを比較することもできます。これは、何が問題なのかを示すのに役立ちます。

于 2012-11-29T14:24:34.067 に答える