ターミナルサービス環境で Windows API の GetWindowsDirectory 関数が正しく動作しない

バグ情報

ターミナルサービス環境で PowerBuilder アプリケーションを利用する場合に Windows API の GetWindowsDirectory 関数が正しく動作しない事象が報告されています。

Bug ID 3637
Product PowerBuilder EN/JP
ステータス Appeon にて検証中
発生バージョン EN 12.6以前 2017 2017 R2 2017 R3 2019 2019 R2
JP 12.6以前 2017 R2 2017 R3

:発生バージョン    :解決済み、未発生    :未確認

詳細

ターミナルサーバー環境上の PowerBuilder アプリケーションで Windows API の GetWindowsDirectory 関数を呼び出すと、ユーザーごとの Windows ディレクトリ (“C:\Users\<user name>\Windows”) ではなく、システムの Windows ディレクトリ (“C:\Windows”) が返されます。

ターミナルサーバー対応でないアプリケーション (レガシーアプリケーションとも呼ばれます) は、マルチユーザー環境で正常に動作するように、レガシーアプリケーションに対して特定の変更を行います。 たとえば、ターミナルサーバーは、Windows の Windows ディレクトリを取得するのではなく、各ユーザーが Windows フォルダーを取得するように、仮想 Windows フォルダーを作成します。 これにより、ユーザーは独自の INI ファイルにアクセスできるようになります。

Windows またはコンソールアプリケーションには /TSAWARE オプションが存在し、このオプションが “有効” な場合はターミナル サーバーは、アプリケーションに特定の変更を加えることができません。

PowerBuilder 12.5 以前で開発されたアプリケーションでは、/TSAWARE フラグが取り除かれていましたが、PowerBuilder 12.6 以降、/TSAWARE フラグが追加されデフォルトで “有効” となっているため、変更を加えることができなくなっています。

回避策

  • TSAWARE フラグを取り除く。
    • 作成済みのアプリケーションに対して TSAWARE フラグを変更するためには Microsoft Visual Studio のツールである “editbin” を使用します。
      下記のように /TSAWARE:NO を付与することにより、アプリケーションから呼び出される GetWindowsDirectory 関数でユーザーごとの Windows フォルダーを取得できるようになります。

【例】

editbin /TSAWARE:NO <filename>.exe
バグ情報 一覧を見る
PowerBuilder マイグレーション
PowerBuilderとは? ~デキる大人へ変身できる?ローコード開発ツール~