質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

403閲覧

vbs上からpowershellのGet-CimInstanceを動かし、vbsに戻り値を渡したい(wmicサポート終了対応)

pokosan-21

総合スコア1

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2024/12/12 14:46

編集2024/12/15 11:49

実現したいこと

お世話になります。

vbs(VisualbasicScript),Powershell、IIS(asp)に知見のある皆様、ご協力を頂けますと助かります。

・wmicサポート終了に伴う、vbsコードの書き換えを進めています。
具体的には、vbsのobjWMIServiceから、powershellのGet-CimInstanceへの
部分置き換え
を考えています。

 ※元のコードを、下記■1.にコピペします。
よくある汎用の、PCの環境情報を参照するコードです。

・なお、vbsファイル(.vbs)自体の利用は継続するため、vbsコード内からpowershellを呼び出し、
戻り値を既存のvbsコードに渡したい
というのが必須条件です

発生している問題・分からないこと

・下記2.のコードで実装したのですが、戻り値(OS-name、Memory)が
取得できません。( 値が取れていないか、nullになっているようです)

 [12/14 追記]
エラーとしては、「For Each objItem in colItem」行のところで、
「オブジェクトでサポートされていないプロパティまたはメソッドです。」
のエラーが発生してしまいます。
配列で出力した(つもりの)データに対して、for eachでの配列の取り出しが
うまく行っていないようです・・

・下記1.の元のコードでは、OS-name、Memoryの値が取得できています。

・変更予定のコードの問題箇所についてお分かりの方、また見直したほうがよい部分
についてご指摘いただけますでしょうか

該当のソースコード

■1.元のコード(全てvbs) strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItem = objWMIService.ExecQuery( "SELECT * FROM Win32_OperatingSystem",,48) tmpSTR = "" For Each objItem in colItem OSname = objItem.Caption Memory = objItem.TotalVisibleMemorySize Next ■2.変更案のコード(vbsからpowershellを呼び出し) Set objShell = CreateObject("WScript.Shell") objExec = "powershell -Command Get-CimInstance -Classname Win32_OperatingSystem" Set colItem = objShell.Exec(objExec) tmpSTR = "" For Each objItem in colItem OS-name = objItem.Caption Memory = objItem.TotalVisibleMemorySize Next ※補足  上記2.で、  Set colItem = objShell.Exec(objExec) の後に、  colItem = objExec.StdOut.ReadAll の標準出力を追加し、  これをfor eachで参照してみたのですが、やはり戻り値は取得できないようです。  [12/14 追記]  問題切り分けの為、Powershell上から下記のコードを実行したところ、応答が返ってきました。  [実行コマンド]  PS C:\WINDOWS\system32> Get-CimInstance -Classname Win32_OperatingSystem | Select-Object Caption, TotalVisibleMemorySize  [結果] Caption TotalVisibleMemorySize ------- ---------------------- Microsoft Windows 11 Home 31388688

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

MS Copilotや、Perplexity等のAIサイトで質問や、
コード変換のクエリーを出して見たのですが、実環境では動きませんでした。

補足

IIS Ver10上のaspより、vbsを参照して動かしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/12/12 23:38

ご提示のコードが断片的で、本質問を見た(私含む)閲覧者、回答者は判断できないように思います。 例えば tmpSTR = "" For Each objItem in colItem OS-name = Item.Caption Memory = Item.TotalVisibleMemorySize Next は、Itemと言う変数がいきなり使われていて、このコードでは再現時にエラーになります。 また、For Each objItem in colItem でobjItemに収められたカラム毎に値を取っているはずなのにItem.Captionを見るとは、For Eachで回すにはあまり意味が無いコードになっているように見えます。 まず、PowerShellのターミナル上で以下のコマンドレット、オプションで手動で実行してみて、目的の値が取れるか確認してみてください。 PS C:\hoge> Get-CimInstance -Classname Win32_OperatingSystem | Select-Object Caption, TotalVisibleMemorySize 手動で正しく取れているのであれば、あとはIIS上で実行しているときのユーザーアカウント、PowerShellのバージョン、IISの中からVBScript、更にPowerShellがそもそも正しく実行できているのか確認する必要があります。
pokosan-21

2024/12/13 12:27 編集

dodox86様 (ご覧頂いている皆様) 分かりやすくご指摘下さり、誠にありがとうございます! また貼り付けたコードに不備があり、失礼しました・・ ① 貼り付けたコードの見直し   ご指摘の変数の修正などを行い、再実行してみました。(修正後のコードは下記)   エラーとしては、「For Each objItem in colItem」行のところで、  「オブジェクトでサポートされていないプロパティまたはメソッドです。」   のエラーが発生してしまいます。   配列で出力した(つもりの)データに対して、for eachでの配列の取り出しがうまく行っていないようです・・  (なお、objExec ・・ の部分を、   objExec = "powershell -Command Get-CimInstance -Classname Win32_OperatingSystem | Format-List *"   と、フォーマット指定で記述してみましたが改善しませんでした。。) Dim objShell,objExec,colItem,objItem Set objShell = CreateObject("WScript.Shell") objExec = "powershell -Command Get-CimInstance -Classname Win32_OperatingSystem" Set colItem = objShell.Exec(objExec) For Each objItem in colItem OS-name = objItem.Caption Memory = objItem.TotalVisibleMemorySize Next WScript.Echo OS-name WScript.Echo Memory ② powershellでのコード実行   あげて頂いたコードをローカル環境で実行したところ、下記通り正常に応答がありました。   [実行コマンド]   PS C:\WINDOWS\system32> Get-CimInstance -Classname Win32_OperatingSystem | Select-Object Caption, TotalVisibleMemorySize   [結果]     Caption TotalVisibleMemorySize   ------- ----------------------   Microsoft Windows 11 Home   この実行コマンド部分を、前記①のコードに組み込んで実行してみたのですが、結果は同じエラーとなりました。 ①、②とも、ローカルPC環境、IISサーバ環境の両方で結果は同じで、 環境による問題ではないように思えます。 以上から、問題点お分かりになりますでしょうか。 よろしくお願いいたします。
dodox86

2024/12/14 02:39

本題ではないコメントで恐縮ですが、 > ① 貼り付けたコードの見直し > >   ご指摘の変数の修正などを行い、再実行してみました。(修正後のコードは下記) このような場合はこのコメント欄ではなく、質問の本文自体を修正、編集して、質問自体の完成度を高めるようにしましょう。長々となったコメントは、読まれない閲覧者の方もいらっしゃいます。 >  あげて頂いたコードをローカル環境で実行したところ、下記通り正常に応答がありました。 > >   [実行コマンド] >   PS C:\WINDOWS\system32> Get-CimInstance -Classname Win32_OperatingSystem | Select-Object Caption, TotalVisibleMemorySize   [結果]     Caption TotalVisibleMemorySize   ------- ----------------------   Microsoft Windows 11 Home TotalVisibleMemorySizeの値が抜けていますが、これは本当に取れていないのか、それとも転記ミスでしょうか。 例えば私の環境(Windows 11は使っていないのでWindows 10 Proですが)では、以下のような出力になります。 PS C> Get-CimInstance -Classname Win32_OperatingSystem | Select-Object Caption, TotalVisibleMemorySize Caption TotalVisibleMemorySize ------- ---------------------- Microsoft Windows 10 Pro 16650468 もし本当に質問者pokosan-21さんの環境で取れないとしたら、PowerShellのコマンドレットではどんなに頑張っても取れないこととなります。 > ①、②とも、ローカルPC環境、IISサーバ環境の両方で結果は同じで、 > 環境による問題ではないように思えます。 環境の問題もあるし、お書きになったVBScript(コード)の問題、PowerShellの使い方、IIS内で実行するASP特有の問題が色々混じっているようです。
pokosan-21

2024/12/14 05:24

dodox86様 (ご覧頂いている皆様) ご指摘ありがとうございます。 基本的な投稿の作法が分かっておらず、大変失礼しました。 質問の本文側を更新をするよう致します。 また切り分けコードの実行結果は、ご指摘とおり添付ミスでした。 お問合せしている状況で、混乱を招いてしまい申し訳ありませんでした。(本文側で更新) ご指摘通り、環境の問題も考えられるため、まずはローカル環境で変更後のコードが動くよう 確認できればと思います。
dodox86

2024/12/15 10:42

うーん、、、コメントしたので注視していますが、正直、回答するのに躊躇しています。以下、長文のコメントになりますがご了承ください。 WMIサービスを使ったご提示のもとのVBScript(含むClassic ASP)のコードですが、 そもそも正しく動いているように思えないです。PowerShellを使う以前の問題です。 > ■1.元のコード(全てvbs) > strComputer = "." > > Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") > Set colItem = objWMIService.ExecQuery( "SELECT * FROM Win32_OperatingSystem",,48) > > tmpSTR = "" > For Each objItem in colItem > OS-name = Item.Caption > Memory = Item.TotalVisibleMemorySize > Next > > 特に、`ExecQuery`で取得した結果セットを`For Each`で回しているのに、突如出てきた`Item.Caption`, `Item.TotalVisibleMemorySize`を参照しています。 また、変数名として`OS-name`がありますが、'-'(ハイフン)は式なので変数名として不正で、実行時コンパイルエラーになります。 ASP(ClassicASP)のコードに落とし込む前に、VBScript単体のコードとして完成されていますでしょうか。この辺りの認識が違っていると、そもそもVBScriptのコードの書き方の問題から、になります。 例えば上記のコードは以下のようであれば正しく動作します。 t2.vbsここから>>> option Explicit Dim strComputer, objWMIService, colItem, objItem strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItem = objWMIService.ExecQuery( "SELECT * FROM Win32_OperatingSystem",, 48) Dim caption, totalVisibleMemorySize For Each objItem in colItem caption = objItem.Caption totalVisibleMemorySize = objItem.TotalVisibleMemorySize Next WScript.Echo "Caption: " & caption WScript.Echo "TotalVisibleMemorySize: " & totalVisibleMemorySize <<<ここまで このt2.vbsをコマンドプロンプト上で実行すると、以下のようになります。(私の環境です) C:\_work>cscript t2.vbs Microsoft (R) Windows Script Host Version 5.812 Copyright (C) Microsoft Corporation. All rights reserved. Caption: Microsoft Windows 10 Pro TotalVisibleMemorySize: 16650468 正しく動作します。で、更に話は戻りますが、「wmicサポート終了に伴う、vbsコードの書き換えを進めています。」とのことですが、wmicとはWMIサービスを扱うコマンドラインユーティリティを指すもので、これがサポート終了と言うだけで、WMIサービス自体は今後も使えると言うことだと思います。 https://learn.microsoft.com/ja-jp/windows/win32/wmisdk/wmic この辺りを混同されていませんでしょうか。そうであるとご提示のコードはwmicを使っている訳ではないので、PowrShellを呼び出すようなコードの書き換えは必要ないことになります。再度のご確認をお勧めします。
pokosan-21

2024/12/15 12:58

dodox86様 (ご覧頂いている皆様) 引き続きコメント頂き、誠にありがとうございます。 ①VBのソースコードについて  度々申し訳ありません・・  問題の切り分けで、トライエラーで変更していた際のコードを貼り付けてしまったようで、  変数名が食い違ってしまったようです。( 質問本文側のコードを訂正しました) ②wmicサポート終了について  こちらも当方の誤認識でした。リンクして頂いた情報や、当方でも調べ直したところ、  今回書き換えたいと投稿した「objWMIService」コマンドは影響を受けないと理解しました。  取り急ぎ、既存コードが継続利用できるとわかり、大変安心しました。 以上、②より本来の目的(=システムの継続利用)が達せられると判断できました。 また当方の説明が不十分なこともあり、①については一旦取り下げたいと思います。 これまでご協力を頂き、誠にありがとうございました。
guest

回答1

0

自己解決

皆様の情報より、今回書き換えたいと投稿した「objWMIService」コマンドは、
wmicサポート終了の影響を受けないと理解しました。

またVBS⇒PSへのコード書き換えは、当方の説明が不十分なこともあり、一旦取り下げたいと思います。

前者より、本来目的達成のため、解決とさせて頂きます。

ご対応、誠にありがとうございました。

投稿2024/12/15 13:10

pokosan-21

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/12/15 16:56 編集

現在の動くコードを改修しない方向で解決できてよかったです。ご自身のこの投稿で自己解決(ベストアンサー)で質問を閉じてください。 [質問をした後に自己解決してしまった] https://teratail.com/help#resolve-myself 個人的な技術的興味からIIS上のClassicASPでPowerShellのGet-CimInstanceコマンドレットを使うやり方も試し、動作するようになりましたが、IIS上で動作させる為にかえって複雑なコードになり、その点でもお勧めしかね、回答しませんでした。その際のポイントとして参考に述べておくと、IIS上では標準入出力が使えないのでPowerShellの実行結果はファイルに出力して扱うかたちとし、WScript.ShellのExecではなくRunを使うことになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問