2009-09-01 19 views
1

LogonUser、LoadUserProfile、ImpersonateLoggedOnUserを使用して別のユーザー(Y)の権限を取得するC++ Windowsアプリケーション(A)を作成します。 意味Aは、ワークステーション(X)にログオンしているユーザーの使用を開始します。ユーザーが彼の権利を昇格させたい場合、ウィンドウからログアウトしてログインすることなく、ボタンを押して別のユーザーとしてログオンすることができます。ImpersonateLoggedOnUserとocxを使用する新しいプロセスの開始に失敗する

状況は次のとおりです(関数の戻り値に従って)。 LogonUserが動作し、LoadUserProfileが動作し、ImpersonateLoggedOnUserも同様に動作します。

偽装後、別のプロセスが開始されます。このプロセスは、OCXコントロールが必要なアプリケーション(B)です。 これは失敗し、アプリケーションは.oxcファイルが正しくインストールされていないことを通知します。

私は、マシン(X)にログオンしているユーザーとしてBを直接起動すると動作します。 Aを使用して自分の権利を昇格させたいユーザ(Y)としてBを直接開始すると、それは機能します。

(X)としてログインしていて、エクスプローラで[実行](Y)を選択した場合、動作します。

「ウィンドウズから実行」ダイアログと同じようにするために必要な手順を知っていますか?

+0

環境がCOM登録は%COMMONPROGRAMFILES%\ SomeDirHere \ MyLib.OCXインプロセスのためのサーバーの場所を使用している場合は特にvarsのことでした。生成されたプロセスの環境をダンプします。 – wqw

答えて

0

はあなたのすべてに感謝WindowsのACLから明示的に偽装ユーザーに設定ProcessAttributes/ThreadAttributesでのCreateProcessを試してみてくださいあなたの助けに。 以下は私の問題を解決しました:
CreateProcessWithLogonW()を使用して、目的のプロセスを開始します。 この関数を正常に動作させるには、私が呼び出す前にRevertToSelf()にしてから、もう一度偽装する必要があります。

だからシーケンスは以下のようになります。

LogonUser() 
LoadUserProfile() 
ImpersonateLoggedOnUser() 
// work with the app 
RevertToSelf() 
CreateProcessWithLogonW() 
// do the impersonation stuff again 
1

私はわからないんだけど、偽装が十分でないように見える - 偽装は、唯一のプロセス(A)に関連し、代わりに

+0

偽装が(A) にしか関係していないというヒントのおかげで、今はCreateProcessWithLogonW()を使用しようとしましたが、MSDNではCreateProcessAsUser()を使用するように指示しています。 今順序は次のとおりです。CreateProcessWithLogonWは()のErrorCode 5で失敗し LogonAsUser() LoadUserProfile() ImpersonateLoggedOnUser() CreateProcessWithLogonW() ここからどこへ行く 任意のアイデアを(アクセスが拒否されましたか)? – markus

+0

sysinternalユーティリティ(FileMonまたはRegMon)を試して、「アクセス拒否」で拒否する前に正確に何が尋ねられたかを明示的に確認してください。また、msdn: "既定では、CreateProcessWithLogonWは指定されたユーザープロファイルをHKEY_USERSレジストリキーにロードしません。つまり、HKEY_CURRENT_USERレジストリキーの情報にアクセスすると、通常の対話型ログオンと一致する結果が生成されません。 OCXは集中的にレジストリを使用することに注意してください。 – Dewfy

+0

@Dewfy:ヒントのおかげで。特にあなたが言及したツールは、将来も私にとって役に立ちます! アクセス拒否は、CreateProcessWithLogonW()を呼び出す前にRevertToSelf()を呼び出すことによって解決されます。 – markus

関連する問題