2

PostScript プリンター ドライバーをインストールし、Postscript 出力をプログラムにリダイレクトするために REDMON (redmonnt.dll) をセットアップしました。私のかなり単純な C プログラムでは、STDIN からデータをキャプチャし、それを .ps ファイルに正常に保存できます。ファイルは問題ないようです。

しかし、ファイルを表示するために gsview.exe を起動したいのです。ShellExecute を呼び出すと、権限の問題により Windows 7 で失敗します。私のプログラムは別のユーザー アカウント (LOCAL SERVICE) で呼び出されているようです。そのため、特定のユーザー名 (印刷ジョブを開始したユーザー) で gsview.exe を実行する方法を探しています。このユーザー名は、SESSIONID と共に REDMON_USER という変数でプログラムで使用できます。

Q:ユーザー名とセッション ID を指定してプログラムを開始するために最低限必要な WinAPI 呼び出しは何ですか?

C/C++、.NET のコード例は非常に役立ちます。

EDIT:私が達成しようとしているのは、(redmoneeからの)redruneeに非常に似たものです。redrunee は、コンソール ウィンドウが一瞬だけ開くため、使用したくありません。

注: 1) プログラムは、プリンター サービスによって [ローカル サービス] アカウントとして呼び出されます。2) 最初のパラメーター Username (REDMON_USER) は、実際には、現在画面を見ているユーザーを指します。

4

2 に答える 2

2

CreateProcessAsUserを見てください。

とも見てCreateProcessWithLogonWくださいCreateProcess

それらは CreateProcessAsUser からリンクされています

EDIT OPによるコメントへの返信。

このスレッドのアドバイスに従ってください。

元のリンクが機能しなくなった場合に備えて、これをそのままコピーしています。

Vista でも XP などと同じコードが機能します。サービスはローカル システムとして実行されます。

  1. WTSGetActiveConsoleSessionId を使用して、コンソールで現在アクティブな Windows セッションの ID を取得します (つまり、WTS セッションではなく、マシンのキーボードとディスプレイ)。

  2. WTSQueryUserToken を使用して、そのセッションのトークンを取得します。

  3. DuplicateTokenEx(hToken,MAXIMUM_ALLOWED,NULL,SecurityIdentification,TokenPrimary, &hTokenDup) を使用してそのトークンを複製します。

  4. CreateEnvironmentBlock を使用して、プロセスに渡す環境を作成します。

  5. 複製されたトークンと作成された環境で CreateProcessAsUser を使用します。実際には、A バージョンには一部の古いシステムで何らかのバグがあったため、CreateProcessAsUserW を使用します。

  6. さまざまなトークンなどで CloseHandle を実行し、環境を DestroyEnvironmentBlock することを忘れないでください。

ありがとうございます

PS。ああ、Windows プログラミングの喜びです。かなり長い間それをしていませんでした。その理由を今思い出しました。近い、またはさらに悪い文書化されている唯一のものは、OpenSSH プログラミングです。

于 2010-05-25T19:04:54.667 に答える
0

ドキュメントでは、「ユーザーとして実行」機能について説明していますが、これはまさにあなたが望むものと思われます。

Run as User は、RedRun を介してローカルで GSview などの GUI プログラムを起動するためのものです。

于 2010-05-26T13:56:46.630 に答える