1

CreateProcessAsUser を使用する場合、STARTUPINFO を渡し、lpDesktop NULL を指定すると、ターゲットは対話型ユーザーの対話型デスクトップである winsta0/default になります。

別の非対話型ユーザー (リモート デスクトップ ユーザーなど) の別のセッションでウィンドウ ステーションをターゲットにしたいと考えています。

winsta0 は単一の対話ユーザー用に予約されているため、winsta0 にすることはできないと思います。

ここで関数リストを見ています: http://msdn.microsoft.com/en-us/library/ms687107(v=VS.85).aspx

マシン上のウィンドウ ステーションを列挙することはできますが、どのウィンドウ ステーションがどのユーザー/プロセス/セッションに接続されているかを特定するにはどうすればよいですか?

各ウィンドウ ステーションはセッションに接続されています 各プロセスにはターゲット ウィンドウ ステーションがあります

しかし、たとえば、プロセスまたはセッション ID を持っている場合、どの Window Station に関連付けられているかをどのように判断すればよいでしょうか?

4

2 に答える 2

2

WinXP/Win2K3 以降では、次の操作を実行できます。

  1. WTSEnumerateSessions を呼び出して、アクティブなセッション情報のリストを取得します (これにより、各セッションに関連付けられたウィンドウ ステーション名も得られます)。
  2. セッション ID を WTSQueryUserToken に渡します。
  3. トークンを GetTokenInformation に渡して、ユーザーの SID を取得します。
  4. ユーザーの SID を LsaLookupSids に渡して、ユーザー名とドメイン名を取得します。

また、アクティブなコンソール セッションであるセッションを特定する場合は、セッション ID を WTSGetActiveConsoleSessionId の戻り値と比較できます。

ただし、Franci が述べたように、WTSQueryUserToken から返されたトークンを使用して、CreateProcessAsUser を介してターゲット デスクトップでプロセスを起動することをお勧めします。偽装トークンからプライマリ トークンに変換するには、DuplicateTokenEx を介して渡す必要がありますが、WinXP 以降で動作し、Microsoft は、Vista のサービス デスクトップから対話型アプリケーションを起動するための「推奨される」方法として文書化しています。より高い。

于 2010-09-04T07:40:07.413 に答える
1

を使用GetUserObjectinformationして、そのウィンドウ ステーションに関連付けられているユーザーの SID を取得できます。

プロセスからウィンドウ ステーションを見つける場合: - プロセスの最上位ウィンドウ ハンドルを取得する
- ウィンドウ ステーションを列挙する ( EnumWindowStations)
- 各ウィンドウ ステーションのデスクトップを列挙する ( EnumDesktops) -見つかるまで
、各デスクトップのウィンドウを列挙する ( )EnumDesktopWindows試合。

ええ、それは簡単ではありませんが、問題を解決するはずです。

: Vista および Win7 では、対話ユーザーは winsta0 にありません。Winsta0 はシステムとサービス専用に予約されており、対話ユーザーは新しい Windows ステーションを取得し、TS ユーザーと (ほぼ) 同じように扱われます。

于 2010-06-18T21:10:28.860 に答える