私は、スレッドレベルの偽装とプロセス生成を行う、以前に書かれたクラスでいくつか問題があります。問題は、私がこれらのユーティリティクラスを使用していることが他の誰かがそれらを使って何をしようとしているかを超えていることにあります。スレッド偽装のマルチレベル使用
最初に、ImpersonateLoggedOnUserと共にOpenThreadTokenとDuplicateTokenを使用してスレッドレベルのなりすましを行います。
OpenThreadToken/DuplicateTokenで取得したトークンを使用してCreateProcessAsUserを使用してプロセスを作成しようとします。
私はに実行している問題は、私が持っているということです。
Thread 1 running in IIS with the correct user
Thread 2 that is created by Thread 1 - which is impersonated
Thread 3 that is created by Thread 2 - which is impersonated
Process 1 that is spawned by Thread 3 - which I attempt to impersonate
産卵プロセス1は、OpenThreadTokenからエラーコード5で失敗します。私がスレッド1からプロセス1を起動すると、OpenThreadTokenは私に何のguffも与えません。私はOpenThreadToken & DuplicateTokenからTOKEN_ACCESS_ALLを求めています。実際にスレッド3からやり遂げるまでは失敗しません。実際にここに必要なアクセス許可については誰にでも分かりますか?私が間違ってここにやっている明らか
(スレッドを偽装するだけでスレッドトークンハンドルを取り、ImpersonateLoggedOnUserの呼び出し関係...)
//process spawn
if (!::OpenThreadToken(::GetCurrentThread(),
TOKEN_ALL_ACCESS,
false,
&hThreadUserToken))
{
Handle hNewProcessUserToken;
if (!DuplicateTokenEx(
hThreadUserToken,
TOKEN_ALL_ACCESS,
NULL,
SecurityDelegation,
TokenPrimary ,
&hNewProcessUserToken))
{
m_dwCreateError = ::GetLastError();
return false;
}
bReturnValue = ::CreateProcessAsUserA(
hNewProcessUserToken,
AppName,
cmdLine,
NULL,
NULL,
TRUE,
0,
m_lpEnvironment,
cwdStr
&m_StartupInfo,
&piProcInfo);
何か:
はここでプロセスを生成するコードですか?私は本当にスレッド1からプロセスを生成することはできません - それは必要な正しい情報を持っていませんし、スレッド3からそれに戻ってハンドルを持っている...良いソリューションではなく、良いデザインではありません。
IISが偽装に関してどのように動作するのかわかりません(セキュリティ上の理由から奇妙なことがあります)。ただし、プロセスのコンテキストで(TRUEをOpenThreadTokenに渡すことによって)トークンを開こうとするか、実際に必要なアクセス権(TOKEN_ALL_ACCESSではなく)。 – Luke
私はTOKEN_ALL_ACCESSを使用しようとしていましたが、必要な権限が十分に文書化されていない場合があります。実際には3番目のスレッドまで成功します。 プロセスのコンテキストで開くことはできません。セキュリティ上の理由から、生成しようとしているプロセスを使用するために必要な権限がありません。 –