問題タブ [createprocessasuser]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
createprocessasuser - 実験で CreateProcessAsUser が正しく機能しない
私は次のことをしようとしています: 1. VS.NET 2005 を実行している XP SP2 マシンに管理者アカウントとしてログインしています 2. このマシンには、ゲスト アカウントである別のアカウント user1 もあります 3. 次のようにプログラムを実行しています管理者、このプログラムから、user1 セキュリティ コンテキスト 4 で実行される notepad.exe プロセスを起動したいと考えてCreateProcessasUser
います。
これは、私が試したことを説明するコードスニッパーです..
何らかの理由でこれは機能していません..DuplicateTokenEx
関数は1305のエラーコードとして返されており、その理由がわかりません..
DuplicateTokenEx
も使用した代わりにDuplicateToken
、CreateProcessAsUser
がエラー コード 1308 を返すようになりました。
誰かがこの問題に光を当ててくれませんか..これは明らかに非常に単純なことのように見えますが、正しく理解できません.. [私は特にやりたいことに注意しLogonUser
てDuplicateToken
くださいCreateProcessAsUSer
]
c# - C# から CreateProcessAsUser を呼び出す
Windows APIの関数を使用して、特定のユーザーのコンテキストで新しいプロセスを作成しようとしましたがCreateProcessAsUser
、かなり厄介なセキュリティの問題が発生しているようです...
詳しく説明する前に、新しいプロセスを開始するために現在使用しているコードを次に示します (コンソール プロセス - 具体的には PowerShell ですが、問題にはなりません)。
ここでの問題のために、環境変数を扱うコードは無視してください (私はそのセクションを個別にテストしましたが、うまくいくようです)。
今、私が得るエラーは次のとおりです(への呼び出しに続く行でスローされますCreateProcessAsUSer
):
「必要な権限がクライアントに保持されていません」(エラー コード 1314)
(エラー メッセージは、Win32Exception コンストラクターからメッセージ パラメーターを削除することによって発見されました。確かに、ここでのエラー処理コードは最適ではないかもしれませんが、それは多少無関係な問題です。ただし、必要に応じてコメントしてください。 ) この状況でのこのあいまいなエラーの原因について、私は本当にかなり混乱しています。MSDN のドキュメントやさまざまなフォーラム スレッドからは多くのアドバイスしか得られませんでした。特に、このようなエラーの原因はさまざまであるため、コードのどのセクションを変更する必要があるのかわかりません。おそらく、変更する必要があるのは単に 1 つのパラメーターにすぎませんが、私が知っているすべてに対して、間違った/不十分な WinAPI 呼び出しを行っている可能性があります。私を大いに混乱させるのは、プレーンを使用するコードの以前のバージョンがCreateProcess
関数(ユーザートークンパラメーターを除いて同等)は完全に正常に機能しました。私が理解しているように、Logon ユーザー関数を呼び出して適切なトークン ハンドルを受け取り、それを複製して に渡せるようにするだけで済みますCreateProcessAsUser
。
コードの変更や説明の提案は大歓迎です。
ノート
私は主に MSDN のドキュメントを参照してきました ( C# の関数/ストラット/列挙型の宣言についてはPInvoke.netも同様です)。特に次のページでは、備考セクションに多くの情報が含まれているように見えますが、そのうちのいくつかは重要であり、私にはわからない可能性があります。
編集
Mitch の提案を試してみましたが、残念ながら古いエラーが新しいエラーに置き換えられました。「指定されたファイルが見つかりません。」(エラーコード 2)
以前の への呼び出しCreateProcessAsUser
は、次のように置き換えられました。
MSDNのドキュメントが示唆しているように、このコードは重複したトークンではなく元のトークンを使用していることに注意してください。
を使用した別の試みを次に示しCreateProcessWithLogonW
ます。今回のエラーは「ログオン失敗: 不明なユーザー名またはパスワードが正しくありません」(エラーコード1326)
また、ユーザー名を UPN 形式 ("Alex@Alex-PC") で指定し、2 番目の引数としてドメインを個別に渡そうとしましたが、すべて役に立ちませんでした (同一のエラー)。
windows-services - CreateProcessAsUser の有効なユーザー トークンを取得するにはどうすればよいですか?
通常のユーザーとして実行されているアプリケーションと、ローカル システムとして実行されているサービスがあります。サービスが他の処理を行ったら、アプリケーションがサービスにアプリケーションを再度開始するように指示できるようにしたいと考えています。(したがって、サービスが「処理」を実行している間は、アプリケーションは実行されません。)サービスがアプリケーションを最初に開始したユーザーとしてアプリケーションを開始できるようにするには、ユーザー トークンが必要です。アプリケーションはサービスが終了する前にトークンをサービスに送信しますが、サービスが使用しようとしているときにトークン/ハンドルが無効です。(最初に行うことは、プライマリ トークンを取得するための DuplicateTokenEx です。)
ユーザー トークンは常に OpenProcessToken を呼び出したプロセスでのみ有効ですか?
これを行うことができる他の方法はありますか?ユーザーがlogonuserでアプリケーションに「ログオン」する必要はありません。それはばかげているでしょう。「explorer.exe」のプロセス ハンドルをアプリからサービスに渡すことができると思います。サービスはユーザー トークンを取得するために使用できますが、それには PROCESS DUP HANDLE アクセス権が必要です。私はその解決策に興奮していませんが、おそらくそれを行う方法ですか?
createprocessasuser - CreateProcessAsUserエラー1314
別のユーザーの下でプロセスを作成したい。したがって、LogonUserとCreateProcessAsUserを使用します。しかし、私の問題は、CreatePtocessAsUserが常にエラーコード1314を返すことです。これは、「必要な特権がクライアントによって保持されていない」ことを意味します。だから私の質問は、私が間違っていることは何ですか?または、どうすればハンドルに特権を与えることができますか?(ハンドルに特権があるはずだと思いますか、それとも間違っていますか?)英語の間違いで申し訳ありませんが、私の英語の知識は最高ではありません:)
誰かが私のアプリケーションを修正する方法を知っているなら、助けてください。
これは私のコードの一部です。
前もって感謝します!
windows-server-2008 - windows-2008-server のサービスからゼロ以外のセッションでプロセスを作成していますか?
サービスがユーザーセッションでプロセスを作成する簡単な方法があるかどうか疑問に思っていましたか?
私のサービスは、LocalSystem アカウントとしてではなく、ユーザー (管理者) アカウントとして実行されているため、WTSQueryUserToken 関数を使用できません。
私は電話してみました
しかし、このトークンを使用して実行すると
プロセスがまだセッション 0 で実行されています。この問題を解決するにはどうすればよいですか?
私は Ole オートメーションを使用しているので、セッション 0 でない限り、プロセスがどのセッションで実行されるかはあまり気にしません。インスタンス) をセッション 0 で作成しますが、他のユーザー セッションでそれらを作成します。
どんな提案でも大歓迎です。前もって感謝します。
oracle - 偽装されたプロセスは、Windows 認証を使用して Oracle にログオンしません
IIS7 で asp .net Web サービスを実行しています。後者は Windows 2008 R2 サーバーで実行されています。IIS7/Web サービスは、asp .net 偽装用に構成されています。ワーカー プロセスの所有者は NETWORK SERVICE に設定されます。
Web サービスは、サーバー上の自分のドメイン アカウントで偽装された sqlplus.exe を呼び出します。タスクマネージャーで確認できます。ただし、sqlplus を開始すると、oracle はユーザー名/パスワードが間違っていると言います。
sqlplus.exe は次のように開始されます: sqlplu.exe / 。ユーザーアカウントでサーバーに手動でログオンし、上記のステートメントを入力すると、これはうまく機能します。すべてがうまく機能します
winapi - 非対話型サービス(win32 / .net / powershell)からUAC昇格されたプロセスを開始する
CreateProcessAsUser()を使用してスクリプトと実行可能ファイルを実行することにより、いくつかの自動化タスクを処理するサードパーティのWindowsサービスを使用しています。UACと、APIを介したLUAの昇格の処理方法が原因で、WindowsServer2008で問題が発生しています。
このサービスはLocalSystemとして実行され、「デスクトップとの対話」が有効になっていません。プロセスはAdministratorsグループのユーザーとして実行されていますが、Administratorアカウント(多くのUAC制限から免除されています)では実行されていません。すべてのUACデフォルト設定が設定されています。
任意のコマンドまたはPowerShellコードをサービスに渡すことはできますが、サービスによって開始される、昇格されていない非対話型のプロセスから「抜け出す」ことができないようです。
問題の核心は、昇格されたプロセスを開始するための唯一の(パブリック)APIオプションが'runas'動詞を持つShellExecute()であるようですが、私が知る限り、非対話型から呼び出すことはできませんサービスを実行しないか、「この操作にはインタラクティブウィンドウステーションが必要です」などのエラーが発生します。
私が見つけた唯一の回避策はここに記載されています: http ://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
Vistaでは、プロセスを昇格させるための公式に文書化された方法は、シェルAPI ShellExecute(Ex)のみを使用することです(CreateProcessまたはCreateProcessAsUserではありません)。したがって、アプリケーションはShellExecute(Ex)を呼び出して、SendInputを呼び出すために昇格されたヘルパーを起動する必要があります。さらに、セッション0の分離により、サービスはCreateProcessAsUserまたはCreateProcessWithLogonW(ShellExecute(Ex)は使用できません)のみを使用してインタラクティブデスクトップを指定できます。
..Windowsサービスから昇格されたプロセスを生成する直接的な方法はないと思います。最初にCreateProcessAsUserまたはCreateProcessWithLogonWを使用して、昇格されていないプロセスをユーザーセッション(インタラクティブデスクトップ)に生成することしかできません。次に、昇格されていないプロセスで、ShellExecute(Ex)を使用して、実際のタスクの昇格されたプロセスを生成する場合があります。
.net / powershellコードからこれを行うには、.Net System.Diagnostics.ProcessStartInfoに同等のlpDesktopがないため、CreateProcessAsUserまたはCreateProcessWithLogonWを呼び出すために複雑なP/Invokeを実行する必要があるようです。 「winsta0\default」に設定します。また、LocalSystemにCreateProcessAsUserまたはCreateProcessWithLogonWを呼び出す権限があるかどうかもわかりません。
また、 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx と Processを確認しました。
これらすべてに基づいて、これを行う簡単な方法はないという結論に達しました。私は何かが足りないのですか?これは本当に難しいことではないようです。UACは、非対話型のユースケースを処理するように設計されたことがないように感じます。
そして、Microsoftの人がこれを読んでしまった場合、ShellExecuteが内部で昇格を処理する方法は、Application Information Service(AIS)を呼び出すことであることに気付きました。Win32または.NETAPIを介してAISへの同じ呼び出しを利用できないのはなぜですか? http://msdn.microsoft.com/en-us/library/bb756945.aspx
少し時間がかかってすみません。アイデアをありがとう。
opengl - Windows 2008 RenderFarm サービス: CreateProcessAsUser "Session 0 Isolation" および OpenGL
XP-64 と W2K3 では正常に動作するレガシー Windows サーバー サービスと (生成された) アプリケーションがありますが、W2K8 では失敗します。これは、新しい「セッション 0 分離」機能によるものだと思います。
そのため、Windows 2008 Server の Windows サービスから新しいプロセスを作成して、以前の動作を復元 (さらにはそれを上回る) できるようにするコード サンプル/セキュリティ設定モジョを探しています。次のようなソリューションが必要です。
- セッション 0 分離制限 (セッション 0 からグラフィックス ハードウェアへのアクセスなし) を回避するために、ゼロ以外のセッションで新しいプロセスを作成します。これに関する公式の MS 行は次のとおりです。
セッション 0 はユーザー セッションではないため、セッション 0 で実行されているサービスはビデオ ドライバーにアクセスできません。これは、サービスがグラフィックをレンダリングしようとしても失敗することを意味します。セッション 0 でディスプレイの解像度と色深度を照会すると、最大 1920x1200 で 32 ビット/ピクセルのシステムの正しい結果が報告されます。
新しいプロセスは、Windows DC の作成に使用できる Windows ステーション/デスクトップ (例: winsta0/default) を取得します。ここでこれに対する解決策(インタラクティブセッションで問題なく起動する)を見つけました:C++でのインタラクティブクライアントプロセスの開始
Windows DC は、 OpenGL DescribePixelFormat 列挙型の基礎として使用される場合、ハードウェア アクセラレーション形式を見つけて使用できます (OpenGL ハードウェアが適切に装備されたシステム上)。ただし、ターミナル サービス セッションが実行されている場合を除きます (VNC は正常に動作します)。また、プロセスが動作するようにする (つまり、ターミナル サービス セッションが開いている場合でも OpenGL ハードウェア アクセラレーションを使用して実行する) ソリューションは、必須ではありませんが、非常に優れています。
私は現在、アイテム#1で立ち往生しています。これについて議論する同様の投稿がいくつかありますが(これ、およびこれなど)、ユーザーセッションがすでにログインして「取る」という保証がないため、適切な解決策ではありませんセッションIDから、また私はLocalSystemアカウントから実行していません(サービスのドメインアカウントから実行しているため、理由の範囲内で特権を調整できますが、優先度をエスカレートして含める必要はありませんSeTcbPrivileges.)
たとえば、これは機能すると思われるスタブですが、SetTokenInformation 呼び出しで常にエラー 1314 を返します (AdjustTokenPrivileges がエラーを返さなかったとしても)。プロセス トークン)、しかし、セッション ID を交換できないようです。
また、すべての場合 (たとえば、対話型のユーザーがログインしていない場合) で WTSActiveConsoleSessionId を使用することについても疑問がありますが、セッションがログインしていない状態で実行されているサービスの簡単なテストでは、適切なセッション値 (1) が返されたようです。
読みやすくするためにエラー処理を削除しました (まだ少し面倒です - 申し訳ありません)。
SetTokenInformation 呼び出しまで、すべてのデバッグ出力は正常に見えます。セッション 0 が現在のプロセス セッションであることがわかります。私の場合は、セッション 1 (WTSGetActiveConsoleSessionId の結果) を設定しようとしています。(RDCではなくVNC経由でW2K8ボックスにログインしていることに注意してください)
だから - 質問:
- このアプローチは有効ですか、それともサービスによって開始されたすべてのプロセスが意図的にセッション 0 に制限されていますか?
- より良いアプローチはありますか (「ログオン時に起動」とサーバーの自動ログオンを除く)。
- このコードに何か問題がありますか、またはセッション ID を交換して新しいセッションでプロセスを生成したいことを示すことができるプロセス トークンを作成する別の方法はありますか? OpenProcessToken の代わりに LogonUser を使用してみましたが、それもうまくいきませんでした。(この時点で、生成されたすべてのプロセスがゼロ以外の同じセッションを共有しているかどうかは気にしません。)
どんな助けでも大歓迎です-ありがとう!
c# - CreateProcessAsUser が GUI を描画しない
ログインしている各ユーザーに対して特定のアプリケーションが実行されているかどうかを確認する「SYSTEM」アカウントで実行されている Windows サービスがあります。アプリケーションが実行されていない場合、サービスは (対応するユーザー名で) アプリケーションを開始します。
CreateProcessAsUser() を使用して目標を達成しようとしています。サービスは対応するユーザー名でアプリケーションを起動しますが、GUI は描画されません。(はい、「デスクトップとの対話をサービスに許可する」チェックボックスが有効になっていることを確認しています)。
システム: XP SP3、言語: C#
興味深いかもしれないいくつかのコードを次に示します。
私の知る限り、設定 startInfo.lpDesktop = "winsta0\default"; 対応するユーザーのデスクトップを使用する必要がありました。
ここに記載されていることとは反対に: http://support.microsoft.com/kb/165194、lpDesktop を null に設定するか、まったく設定しないで試してみましたが、どちらも同じ結果になりました: プロセスは期待される名前で開始されましたユーザーと私は、ウィンドウのタイトル バーの一部を見ることができました。「見えない」ウィンドウは、マウス クリック イベントをインターセプトし、期待どおりに処理します。それ自体を描画しません。
そのような問題に精通していて、私が間違っていることを知っている人はいますか?