2

概要

The Process

C++ でコンパイルされた exe/dll を実行する

シナリオ

  1. 標準ユーザー アカウント (管理者なし) にログイン (win 7)
  2. 管理者として実行The Process
  3. The ProcessShellExecuteを使用してアプリ (exe) を開きます

問題

アプリは管理者ユーザーのスコープで開かれます

期待

アプリは標準ユーザーの範囲で開かれます


ソリューション

1.CreateProcessAsUser

CreateProcessAsUserを使用します(問題を解決する必要があったと仮定してhToken)。

ただし、エラーコード1314 - ERROR_PRIVILEGE_NOT_HELDで呼び出しが失敗しました。ドキュメントに戻ると、次のことがわかります。

この関数が ERROR_PRIVILEGE_NOT_HELD (1314) で失敗した場合は、代わりに CreateProcessWithLogonW 関数を使用してください。

だから私は掘り下げて、このCreateProcessAsUser Error 1314を見つけましたが、これはあまり役に立ちませんでした。

2.ImpersonateLoggedOnUser

ImpersonateLoggedOnUserを使用すると、同じエラー コードが生成されました: 1314 - ERROR_PRIVILEGE_NOT_HELD

3.CreateProcessWithLogonW

CreateProcessWithLogonWlpPasswordには、当然私が持っていないものが必要です


質問

管理者プロセスは、ログインしているユーザーでどのようにアプリケーションを開くことができますか?

4

2 に答える 2

1

ドキュメントCreateProcessWithTokenWに記載されているものを使用してみましたか? CreateProcessWithLogonWよりもはるかに弱い権限が必要なようです。(ではなく)CreateProcessAsUser所有する必要があります。SE_IMPERSONATE_NAMESE_ASSIGNPRIMARYTOKEN_NAME

対話型ユーザーのトークンを既に持っているとおっしゃっていたので、それについては触れません。

(注: を含む、これらすべてに奇妙なバグが報告されていますCreateProcessWithTokenW。最初の試行であきらめないでください。バグと修正例: CreateProcessWithTokenW が ERROR_ACCESS_DENIED で失敗する理由)


hToken「権利」ではありません。トークンです。エラーは、あなたが権限を持っていないことを示しています。

特権を保持することは、基本的な権利ではありません。一部の特権は、デフォルトで特定のユーザーに付与されます。その他は、ローカル セキュリティ ポリシー(MMC スナップインの [ユーザー権利の割り当て] ノード、または [アカウントへの権限の割り当て]LsaAddAccountRightsページに記載されている) を使用して指定する必要があります。

それに加えて、を使用して特権を有効にする必要がある場合がありますAdjustTokenPrivileges。これについては、兄弟ページのChange Privileges in a Token に記載されています。

一部の API は、保持している場合に有効になります。他の人はそうしませんし、あなたが自分でそうするように要求します. 明らかな方法は、呼び出しの前に特権を有効にし、それを必要とすることが文書化されている API です。

MS フォーラムへのリンクはなかったかもしれませんが、エラー メッセージは非常に明確です。MSDN は関数について次のように述べています。

通常、CreateProcessAsUser 関数を呼び出すプロセスにはSE_INCREASE_QUOTA_NAME権限が必要であり、トークンが割り当て可能でない場合はSE_ASSIGNPRIMARYTOKEN_NAME権限が必要になる場合があります。

エラーは(リンク先のページから!):

ERROR_PRIVILEGE_NOT_HELD
  1314 (0x522)
  必要な権限がクライアントによって保持されていません。

于 2015-11-08T02:54:25.303 に答える