CreateProcessWithLogonW() の問題 - 同じユーザーでサブプロセスを起動する必要がある
-
09-09-2019 - |
質問
指定されたユーザー詳細のセットを使用して CreateProcessWithLogonW() を呼び出すことによってサービス内から起動される Windows 実行可能ファイルがあります。
これは正常に機能し、プロセスは期待どおりに開始されます。ただし、このプロセスが他のプロセス自体を起動しようとすると、現在は CreateProcess() を使用しているだけですが、これらは起動してすぐに終了します。これらはデスクトップ アクセスを必要とする実行可能ファイルです。
CreateProcess() に関する Microsoft の記事を読んだ後 - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
なぜこれが起こっているのか理解できると思いますし、ある程度は理にかなっています。CreateProcess() は、呼び出しプロセスがユーザーを偽装していることを認識しているため、その親プロセス (この場合はローカル システム アカウント) を使用します。ただし、当然のことながら、ローカル システム アカウントで実行されるものには必要なアクセス権がないため、起動されたプロセスは停止します。
奇妙なことに、以前 LogonUser() と CreateProcessAsUser() を使用してサービス内で最初の実行可能ファイルを起動していたときは、正常に動作しました。しかし、正しい権限がないという問題のため、これを CreateProcessWithLogonW() に変更する必要がありました。
誰かこれに対する解決策を知っていますか?これに関する議論をウェブ上の他の場所で見たことがありますが、明確な解決策はありませんでした。CreateProcessWithLogonW() でログオンしているユーザーのトークンが必要なようです。そうすれば、後で他のプロセスを起動するためにそれを使用できますか?しかし、このトークンを取得する方法がありません。何らかの方法で現在のユーザーのためにこれを取得することはできますか?
助けていただければ幸いです、ありがとう:)
解決
あなたはCreateProcessWithLogonW
を使用して起動コードを所有する(そして今度はCreateProcess
呼び出して)いますか?そうしないなら、あなたはの IAT(またはAPI)フックの<を実行する必要があります/ strong>は、その上に(つまり、実行時に)、またCreateProcess
またはCreateProcessWithLogonW
を使用して、適切な手順でCreateProcessWithTokenW
するすべての呼び出しを置換するよう。 APIHijackを参照してください。 に、迂回するます。
、子プロセスはHKCU
へのアクセスが必要な場合があります。あなたはすでにこれをやっていない場合は、CreateProcessWithLogonW
を呼び出す前に、一度ユーザごとに、それぞれの偽装ユーザーのプロファイルをロードする必要があります。
デフォルトでは、CreateProcessWithLogonW 指定されたユーザーをロードしません。 HKEY_USERSレジストリにプロフィール キー。これはへのアクセスを意味し、 HKEY_CURRENT_USERの情報 レジストリキーには、結果が得られないことがあり ノーマルと一致していること 対話型ログオン。それはあなたです ユーザーをロードするための責任 前HKEY_USERSにレジストリハイブ で、CreateProcessWithLogonWを呼び出します LOGON_WITH_PROFILEを使用して、またはで LoadUserProfile関数を呼び出します。
他のヒント
私たちは、私は長い間、前に発見いくつかのコードを使用して問題を解決しました。ソース・モジュールの一つの「著作権」セクションには、以下が含まれます:
/////////////////////////////////////////////////////////////
// CreateProcessAsUser.cpp
//
// Written by Valery Pryamikov (1999)
//
// Command line utility that executes a command under specified user identity
// by temporarily installing itself as a service.
//
// Based on Keith Brown's AsLocalSystem utility (http://www.develop.com/kbrown)
// Uses some code from Mike Nelson's dcomperm sample utility
// and from tlist sample (Microsoft Source Code Samples)
//
// Use:
// CreateProcessAsUser.exe [-i[nteractive]]|[-s[ystem]]|
// [-u"UserName" -d"DomainName" -p"Password"]|[-a"AppID"] command
// Command must begin with the process (path to the exe file) to launch
// -i process will be launched under credentials of the
// "Interactive User" (retrieved from winlogon\shell process)
// -a process will be launched under credentials of the user
// specified in "RunAs" parameter of AppID.
// -s process will be launched as local system
// -u -d -p process will be launched on the result token of the
// LogonUser(userName,domainName,password,LOGON32_LOGON_BATCH...)
//
// either (-s) or (-i) or (-a) or (-u -d -p) parameters must supplied
//
// Examples:
// CreateProcessAsUser -s cmd.exe
// CreateProcessAsUser -a"{731A63AF-2990-11D1-B12E-00C04FC2F56F}" winfile.exe
//
/////////////////////////////////////////////////////////////
おそらく、この情報は、Googleの検索中にヒットが得られます - 私はいくつかの簡単な試みを試みたが、手ぶらで来ました。 我々は必要な結果が得られたAPIのセットに内部を分解します。
サービスは彼らがデスクトップと対話できるようにするためのオプションはありませんか?あなたのサービスのためにそのオプションを設定することが可能であるならば、それはおそらく最も簡単な解決策になる。
このプロセスはサービスであると仮定しています。それは質問では指定されていませんが、ローカルシステムアカウントとして実行されていることを考えると論理的だと思われます。
あなたが行き詰まっている場所はそこではありません CreateProcess
, 、 入った CreateService
. 。サービスがデスクトップと対話できるようにしたい場合は、次のように指定する必要があります SERVICE_INTERACTIVE_PROCESS
引数へのフラグの 1 つとして dwServiceType
. 。この設定は、サービスの子プロセスに継承されます。
また、サービス ツールを使用して既存のサービスの設定を変更し、サービスのプロパティを選択し、[ログオン] タブをクリックして、[サービスとデスクトップの対話を許可する] チェック ボックスをオンにすることもできます。