VBAでPCのセッションIDを取得したい


Excel VBAで、コマンドプロンプトから `query session`
で取得できるセッション番号をコードで拾えるようにしたいのですが、どうすればできますでしょうか。

他のサイトを見て、Shellを使用して取得しようとしたのですが、戻ってきた値は空でした。

テストとして書いてみただけのコードですので、どうして `i` が文字列変数なのかとかは気にしないでください。

よろしくお願いいたします。

下記がそのコードです。

[code]

    Dim wsh As Object
    
    Set wsh = CreateObject("WScript.Shell")
    
    'コマンド結果を格納する変数
    Dim result As Object
    Set result = CreateObject("WScript.Shell")
     
    Dim cmd As String
    Dim filedata() As String
    Dim i As String
     
    '実行したいコマンド
    cmd = "query session"
     
    'コマンドを実行
    Set result = wsh.exec("%ComSpec% /c " & cmd)
    'コマンドの実行が終わるまで待機
    Do While result.Status = 0
        DoEvents
    Loop
    
    '結果を改行区切りで配列へ格納
    filedata = Split(result.StdOut.ReadAll, vbCrLf)
     
    'A1から順番に結果を書き込む
    i = ""
    Dim filenm As Variant
    For Each filenm In filedata
        i = i & filenm & vbNewLine
    Next
     
    Set result = Nothing
    Set wsh = Nothing
    
    MsgBox i
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/ZELCA.jpg)](https://i.stack.imgur.com/ZELCA.jpg)




`query.exe`は64bit版の`C:\Windows\System32\query.exe`は存在しますが、32bit版の`C:\Windows\SysWOW64\query.exe`は存在しません。  
その上で、32bitプロセスが`C:\Windows\System32`を参照しようとすると[File System
Redirector](https://docs.microsoft.com/en-us/windows/win32/winprog64/file-
system-redirector)の機能により`C:\Windows\SysWOW64`にリダイレクトされてしまいます。

そのため、32bit版Excelから外部プロセスとして`C:\Windows\System32\cmd.exe /C
C:\Windows\System32\query.exe`を起動しようとすると（リダイレクトされて`C:\Windows\SysWOW64\cmd.exe
/C
C:\Windows\System32\query.exe`が実行されます。32bit版cmd.exeは`C:\Windows\System32\query.exe`を実行しようとしますがリダイレクトされて）`C:\Windows\SysWOW64\query.exe`を実行しようとして「コマンドが見つからない」となります。

解決策は、同ページに説明があるように（Windows
Vista以降であれば）`C:\Windows\Sysnative`を使用することです。`C:\Windows\Sysnative`を指定すると32bitプロセスであっても`C:\Windows\System32`を参照できます。

今回であれば実行ファイルとして`C:\Windows\Sysnative\query.exe`を指定してください。

