2009-02-27 9 views
1

サービス内から起動されるWindows実行可能ファイルには、指定されたユーザーの詳細を含むCreateProcessWithLogonW()を呼び出します。CreateProcessWithLogonW()の問題 - 同じユーザーでサブプロセスを起動する必要があります

これは正常に動作し、プロセスは正常に開始されます。ただし、このプロセスが他のプロセス自体を起動しようとすると、現在のところCreateProcess()を使用するだけですぐに終了します。これらはデスクトップアクセスが必要な実行ファイルです。

のCreateProcessのMicrosoftの記事()にまで読んだ後 - http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

私はなぜこれが起こっている見ることができると思うし、それはある程度理にかなっています。 CreateProcess()は、呼び出しプロセスがユーザーを偽装して親プロセス(この場合はローカルシステムアカウント)を使用することを認識します。もちろん、ローカルシステムアカウントで実行されるものには、必要なアクセス権がないため、起動されたプロセスが終了します。

私は以前、LogonUser()とCreateProcessAsUser()を使ってサービス内の最初の実行可能ファイルを起動していましたが、うまくいきました。しかし、私はこれをCreateProcessWithLogonW()に変更しなければなりませんでした。

誰でもこの解決策を知っていますか?私はWeb上の他の場所でこのことについて話しましたが、明確な解決策はありませんでした。それは、私はおそらく私はCreateProcessWithLogonW()で私はそれを使用して後で他のプロセスを起動することができますログオンしているユーザーのトークンが必要なようですね?しかし、私はこのトークンを取得する方法がない、これは現在のユーザーのために何らかの形で取り戻すことができますか?

任意の助けをいただければ幸いです、ありがとう:)

答えて

1

CreateProcessWithLogonWを使用して起動したコードを所有していますか(また、CreateProcessを呼び出していますか?)実行しない場合は、CreateProcessへの呼び出しをCreateProcessWithLogonWまたはCreateProcessWithTokenWを使用する適切な手順に置き換えて、実行時にIAT (or API) hookingを実行する必要があります。 APIHijack,Detoursを参照してください。

これが行われた後、子プロセスはHKCUにアクセスする必要があります。これをまだ実行していない場合は、CreateProcessWithLogonWを呼び出す前に、各ユーザーのプロファイルを1人1回ずつ読み込む必要があります。デフォルトでは

、CreateProcessWithLogonW はHKEY_USERSレジストリ キーに指定されたユーザ プロファイルをロードしません。これは、HKEY_CURRENT_USER レジストリキーの 情報にアクセスすると、通常の 対話型ログオンと一致する結果の が生成されないことを意味します。またはLoadUserProfile関数を呼び出すことにより、 LOGON_WITH_PROFILEを使用して により、CreateProcessWithLogonWを呼び出す 前に、HKEY_USERSにユーザー レジストリハイブをロードするために、あなたの 責任です。

0

は、彼らがデスクトップと対話できるようにするサービスのためのオプションがありませんか?サービスのオプションを設定することが可能な場合は、おそらく最も簡単な解決策です。

+0

このオプションはすでに設定されています。サービス自体は問題ではなく、正しいユーザーの下で実行可能な罰金を起動しています。それは実行可能な試みが原因で問題を引き起こすプロセスです... –

+0

興味深い。私はその許可が子プロセスによって継承されると思っていたでしょう。 –

1

私はずっと前に発見したコードを使用して問題を解決しました。ソース・モジュールの一つの「著作権」セクションには、以下が含まれています

///////////////////////////////////////////////////////////// 
// 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にしました。

0

私はこのプロセスがサービスであると仮定しています。その質問には指定されていませんが、ローカルシステムアカウントとして実行されていると考えられます。

あなたがこだわっているところはCreateProcessにありません。それはCreateServiceです。サービスがデスクトップと対話できるようにするには、dwServiceTypeのフラグの1つとしてSERVICE_INTERACTIVE_PROCESSを指定する必要があります。この設定は、サービスの子プロセスによって継承されます。

サービスツールを使用してサービスのプロパティを変更し、サービスのプロパティを選択し、[ログオン]タブをクリックし、[サービスとデスクトップとの対話を許可する]チェックボックスをオンにすることもできます。

+0

おっと、私は上記のコメントから、これは既に除外されているという別の質問を見る。 –

関連する問題