ログイン画面 (デスクトップ コントロール用) でプロセスを生成するサービスとして実行されるプロジェクトの一部として、OpenProcessToken() を呼び出します。これが複製され、プロセスが作成されます。これは LocalSystem では正常に機能しますが、ドメイン アカウントでは機能しません。コードフラグメントは以下のとおりです...
procedure LaunchProcess;
var dwPid, dwSessionId: DWord;
hUserToken, hProcess: THANDLE;
begin
dwPid := GetProcessID('winlogon.exe', WTSGetActiveConsoleSessionId);
hProcess := OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
if (not OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY or TOKEN_DUPLICATE or
TOKEN_ASSIGN_PRIMARY or TOKEN_ADJUST_SESSIONID or TOKEN_READ or TOKEN_WRITE, hUserToken)) then
raise Exception.Create('OpenProcessToken failed (' + SysErrorMessage(GetLastError) + ').');
{...go on to duplicate token, create environment and launch process...}
end;
周囲のサポート機能の完全なソースは、ここにあります。
ここが少し曖昧なところです。OpenProcessToken() には権限が必要であることを理解しています。これが最終的にエラーが発生する理由ですが、必要な権限と、それをドメイン アカウントに対して効果的に割り当てる方法が明確ではありませんでした。
これは、必要な特権が SeTcbPrivilege (「オペレーティング システムの一部として機能する」) であることを示唆しています。
ローカルまたはグループ セキュリティ ポリシーを使用して SeTcbPrivilege をドメイン アカウントに割り当てることができることを示唆する特権に関する Microsoft のページ (リンクできません、評判が不十分です - 申し訳ありません) を読みました。また、宛先プロセス (つまり、winlogon.exe) がLocalSystem 以外のトークンの取得を許可しない可能性があることも示唆されています。
サービスのアカウントを使用してドメイン アカウントを明示的に構成しようとしましたが、ローカル セキュリティとグループ ポリシーでgporesult
、ポリシーが有効になったことを確認するために再起動して実行しましたが、whoami /priv
戻るたびに SeTcbPrivilege が無効になっています
私の質問は、これが可能かどうか (ドメイン アカウントを使用して winlogon.exe トークンを取得できますか) であり、可能であれば特権をプログラムで設定できますか、それとも GPO を介して設定する必要がありますか? (もしそうなら、以前の GPO の使用の試みが効果がなかったことを考えると、どのように可能でしょうか)