ターミナルサービスで動いている?

Windows Server 2008 の目玉機能に TS RemoteApp があります。
従来のターミナルサービスでは、デスクトップ全体をターミナルに配信していましたが、
TS RemoteApp では、アプリケーションだけを配信するテクノロジです。
使ってみると、結構、便利だし感動しますね。
例えば、自分の PC には、Office 2003 をインストールしているけど Office 2007 も使う必要があり、
この場合には、Office 2007 を TS RemoteApp で使うとすご~く便利です。

さて、自前のアプリケーションを TS RemoteApp に対応させたいという場合があるかと思います。
基本的には、ターミナルサービス に対応できるアプリケーションであれば
問題なく、TS RemoteApp でも動作できるのですが、注意点があります。

TS RemoteApp では、単一の実行ファイル(.exe)を RemoteApp プログラムとして登録するので、
複数の実行ファイル(.exe)から成り立つアプリケーションではうまく動作できません。
言うなれば、TS RemoteApp をサポートしたかったら、単一 exe になるような
アプリケーション設計をしなければなりません。 (exe から使う dll は問題ありません)

アプリケーション側で、自分が今、TS RemoteApp で動作しているということはわかるのでしょうか?
・・・
実はわからないんです…。
・・・
TS RemoteApp で動作しているのか、ターミナルサービスで動作しているのかの区別は
残念ながら、できないのです。API も用意されていません。
ただ、ターミナルサービス経由で動作しているかの判断はできますので、それを紹介します。

GetSystemMetrics() という API がありますので、それを使います。

BOOL bRemote = GetSystemMetrics(SM_REMOTESESSION);
if (bRemote) {
  // Running in Terminal Environment
}
else {
  // Not Running in Terminal Environment
}

簡単でしょう。これだけです。
これだけだと寂しいので、セッション情報も取得してみましょう。

#pragma comment(lib, "WtsApi32")
#define INFO_BUFFER_SIZE 32767

TCHAR infoBuf[INFO_BUFFER_SIZE];
DWORD bufCharCount = INFO_BUFFER_SIZE;

bufCharCount = INFO_BUFFER_SIZE;
if(!GetComputerName(infoBuf, &bufCharCount)) {
  printf("Error GetComputerName");
  return;
}
printf("\nServer Computer name: %S\n", infoBuf);

DWORD CurrentSessionId;
ProcessIdToSessionId(GetCurrentProcessId(), &CurrentSessionId);
printf("Session Id %d\n", CurrentSessionId);
LPTSTR ppBuffer = NULL;
DWORD pBytesReturned = 0;
WTSQuerySessionInformation(
  WTS_CURRENT_SERVER_HANDLE,
  CurrentSessionId,
  WTSClientName,
  &ppBuffer,
  &pBytesReturned);
printf("RDC client name %S\n",ppBuffer);
WTSFreeMemory(ppBuffer);

こんな感じです。
Windows Server 2008 と共にターミナルサービス環境が増えてきそうですね。


そういえば、TS RemoteApp マネージャ画面の RemoteApp プログラムを見ると、
なぜか ListView コントロールが英語版のまま( OS は日本語版なのに )…。あれっ?

TSRemoteApp

では、この辺で。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。