

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)


CC BY-SA 4.0
2021-10-06T02:17:05.567
82902
2021-10-07T17:05:08.017
2021-10-07T12:27:55.607
4236
9374
question
windows vba session
VBAでPCのセッションIDを取得したい


こちらの環境でも同じ現象が発生しますが、次のようにコードを変更したところ`query session`の結果を取得できるようになりました。

【変更前】

[code]

    '実行したいコマンド
    cmd = "query session"
    
[/code]

【変更後】

[code]

    '実行したいコマンド
    cmd = "C:\Windows\WinSxS\amd64_microsoft-windows-t..es-commandlinetools_31bf3856ad364e35_10.0.19041.1_none_9aa166e99861c2bc\query.exe session"
    
[/code]

環境によってquery.exeのパスは変わるかもしれません。問題が解消しない場合はquery.exeを検索し、見つかったパスで試してみてください。

【実行結果】  
[![実行結果](https://i.stack.imgur.com/4QpJl.png)](https://i.stack.imgur.com/4QpJl.png)

【確認に使用した環境】

[code]

    エディション  Windows 10 Pro
    バージョン   20H2
    OS ビルド  19042.1237
    エクスペリエンス    Windows Feature Experience Pack 120.2212.3530.0
    
[/code]

* * *

query.exeが完全パス名ではないのが原因と考え、query.exeを検索してみました。  
`C:\Windows\System32\query.exe`が見つかったので、こちらで実行したところ現象はかわりませんでした。※セッションの情報が取得できない  
`C:\Windows\WinSxS\amd64_microsoft-windows-t..es-
commandlinetools_31bf3856ad364e35_10.0.19041.1_none_9aa166e99861c2bc\query.exe`も見つかったので試しに実行してみたところ現象は解消しました。

この２つのquery.exeのサイズ、タイムスタンプは同じでした。  
どうしてこの２つのquery.exeの振る舞いが変わるのかは不明のままですが、単にqueryとした場合は`C:\Windows\System32\query.exe`が起動され、セッションの情報が取得できないのだと思います。

* * *

見つかったquery.exeと実行時のふるまいは次のとおりです。

[code]

    C:\Windows\System32\query.exe session
    
[/code]

  * cmdから実行可能
  * VBAから実行しても値が返らない

* * *
[code]

    C:\Windows\WinSxS\amd64_microsoft-windows-t..es-commandlinetools_31bf3856ad364e35_10.0.19041.1_none_9aa166e99861c2bc\query.exe session
    
[/code]

  * cmdから実行可能
  * VBAから実行すると値が返る

* * *
[code]

    C:\Windows\WinSxS\wow64_microsoft-windows-t..es-commandlinetools_31bf3856ad364e35_10.0.19041.1_none_a4f6113bccc284b7\query.exe session
    
[/code]

  * cmdから実行できない。
  * 以下のダイアログとメッセージが表示される。

[![ダイアログの画像](https://i.stack.imgur.com/JdNyG.png)](https://i.stack.imgur.com/JdNyG.png)

[code]

    このバージョンの C:\Windows\WinSxS\wow64_microsoft-windows-t..es-commandlinetools_31bf3856ad364e35_10.0.19041.1_none_a4f6113bccc284b7\query.exe は、実行中の Windows のバージョンと互換性がありません。コンピューターのシステム情報を確認してか ら、ソフトウェアの発行元に問い合わせてください。
    
[/code]


CC BY-SA 4.0
2021-10-07T12:13:39.780
82944
2021-10-07T17:05:08.017
2021-10-07T17:05:08.017
35558
35558
82902
answer


`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`を指定してください。


CC BY-SA 4.0
2021-10-07T12:25:53.367
82945
2021-10-07T12:31:11.430
2021-10-07T12:31:11.430
4236
4236
82902
answer