none
SessionIDからUserNameを知りたい RRS feed

  • 質問

  • SessionIDからUserNameを知りたいと思っています.

    WTSQuerySessionInformationで得られる様なのですがCLRの範囲(マネージコード)で得る方法はどうなるでしょうか?

     

    2007年1月17日 2:38

回答

  •  bsc.tc.y さんからの引用

    SessionIDからUserNameを知りたいと思っています.

    WTSQuerySessionInformationで得られる様なのですがCLRの範囲(マネージコード)で得る方法はどうなるでしょうか?

     

     

    CLRのコードだけで実現は無理ですが、指摘されているAPI関数(WTSQuerySessionInformation)をマーシャリングして実行すれば取得できます。

    /// <summary>
    /// 指定したセッションから取得する情報の種類
    /// </summary>
    public enum WTS_INFO_CLASS
    {
        /// <summary>
        /// ユーザーのログオン時にターミナルサービスが実行する初期プログラム名
        /// </summary>
        WTSInitialProgram,
        /// <summary>
        /// セッションが実行しているアプリケーションの公開名
        /// </summary>
        WTSApplicationName,
        /// <summary>
        /// 初期プログラムの起動時に使う既定のディレクトリ
        /// </summary>
        WTSWorkingDirectory,
        /// <summary>
        /// OEMID(文字列)
        /// </summary>
        WTSOEMId,
        /// <summary>
        /// セッション識別子
        /// </summary>
        WTSSessionId,
        /// <summary>
        /// セッションに関連付けられたユーザー名
        /// </summary>
        WTSUserName,
        /// <summary>
        /// 指定したセッション名
        /// </summary>
        WTSWinStationName,
        /// <summary>
        /// ログオンしたユーザーのドメイン名
        /// </summary>
        WTSDomainName,
        /// <summary>
        /// セッションの現在の接続状態
        /// </summary>
        WTSConnectState,
        /// <summary>
        /// クライアントのビルド№
        /// </summary>
        WTSClientBuildNumber,
        /// <summary>
        /// クライアント名
        /// </summary>
        WTSClientName,
        /// <summary>
        /// クライアントがインストールされているディレクトリ
        /// </summary>
        WTSClientDirectory,
        /// <summary>
        /// クライアント独自の製品識別子
        /// </summary>
        WTSClientProductId,
        /// <summary>
        /// クライアント独自のハードウェア識別子
        /// </summary>
        WTSClientHardwareId,
        /// <summary>
        /// クライアントのネットワークの種類とネットワークアドレス
        /// </summary>
        WTSClientAddress,
        /// <summary>
        /// クライアントのディスプレイに関する情報
        /// </summary>
        WTSClientDisplay,
        /// <summary>
        /// クライアントのプロトコル情報
        /// </summary>
        WTSClientProtocolType,
    }

    /// <summary>
    /// 指定したサーバー上の、指定したユーザーに関する構成情報を取得します。
    /// </summary>
    [DllImport("wtsapi32.dll", SetLastError = true)]
    static extern bool WTSQuerySessionInformation(IntPtr hServer, uint SessionId, WTS_INFO_CLASS WTSInfoClass, ref IntPtr pBuffer, ref int pBytesReturned);

    /// <summary>
    /// ターミナルサービス関数で確保したメモリを解放します。
    /// </summary>
    [DllImport("wtsapi32.dll", ExactSpelling = true, SetLastError = false)]
    static extern void WTSFreeMemory(IntPtr memory);

    <コーディング例>
    IntPtr hServer = IntPtr.Zero; // アプリケーションを実行しているターミナルサーバーのハンドル
    IntPtr Buf = IntPtr.Zero;
    int BufCnt = 0;

    if (WTSQuerySessionInformation(hServer, SessionId, WTS_INFO_CLASS.WTSUserName, ref Buf, ref BufCnt))
    {
        string UserName = Marshal.PtrToStringAnsi(Buf);
        WTSFreeMemory(Buf);
    }

     

    2007年2月19日 9:58