• ベストアンサー

エクセルVBAでPCシャットダウン

ネットを検索してたら、PCをシャットダウンさせるというコード Set objSystemSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 1 Next をみつけたので以下のように試してみました。 Sub TEST() Application.OnTime Now + TimeValue("0:05:00"), "PC_ShutDown" End Sub Sub PC_ShutDown() Set objSystemSet = _ GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}") _ .InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 1 Next End Sub ところが実行すると、ログオフし、画面に、「コンピュータの電源を切ることができます」と表示されるのですが、そこでとまってしまいます。 PCの電源ボタンも長押しないときかなくなります。 自動で電源は切れないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 WMIで、Office は終了して、最後まで動いているのなら、「自動で電源は切れない」というのは、 objSystem.Win32Shutdown 1 引数が違うような気がしますが。 ExitWin  EWX_LOGOFF  = 0 ログオフ  EWX_SHUTDOWN = 1 シャットダウン  ←電源が切れる状態  EWX_REBOOT  = 2 リブート  EWX_FORCE  = 4 強制       ←必要?  EWX_POWEROFF = 8 パワーオフ    ←必要? たぶん、  objSystem.Win32Shutdown 4 + 8 ではないかと思います。 ただ、そのような内容のコードは、かなりデリケートな部分を含んでいますから、終了時の状態を監視せずに、終了することは、避けたほうがよいのではないか、と思います。

merlionXX
質問者

お礼

ありがとうございました。 objSystem.Win32Shutdown 4 + 8 で、完璧に作動しました。 > 終了時の状態を監視せずに、終了することは、避けたほうがよいのではないか、と思います。 はい、普段に使おうとは思っていません。 でも、どういう不具合が考えられるのでしょうか?

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 >でも、どういう不具合が考えられるのでしょうか? ご存知だとは思いますが、終了時に、その設定を保存するのは普通ですが、場合によっては、終了時、ダウンロードデータを更新していることがありますね。また、メモリ上に、プロセスを残したり、ネットワークでトラブることがあるようです。たぶん、セキュリティ系の関係じゃないかと思います。起動して何も触らないまま、そのままExitWin することはないわけで、通常のパターン(XP?)なら、問題はないと思うものの、私などは、最後の終了までをメッセージなど何も出ないことを確認しないと、気に掛かるわけです。その監視自体を、マクロで行わせるには、ちょっと荷が重そうです。

merlionXX
質問者

お礼

ご丁寧にありがとうございました。 では、エクセル以外のプログラムはすべて終了したことを確認してから使用したいと思います。 お手数をおかけしました。 ありがとうございます。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

実証したわけでは有りませんが >objSystem.Win32Shutdown 1  objSystem.Win32Shutdown 8 かも? http://www.wmifun.net/sample/win32_operatingsystem.html ただアプリケーションの中で、更新後に変更を保存してないものがあったりすると シャットダウン処理が中断してしまったり、 ACPIの設定で出来ないものは有るかもしれません。 WindowXP Pro でしたらコマンドプロンプトの Shutdown をShellで呼び出しても・・ 他のPCのシャットダウンも(一部)出来ますのでお試しあれ。

merlionXX
質問者

お礼

ありがとうございました。 objSystem.Win32Shutdown 8 で通常はOKでしたが、スクリーンセイバー(パスワード付き)が起動していると止まってしまいました。

関連するQ&A

  • 任意のプログラムを終了させてからシャットダウンプログラムを走らせるには?

    すいませんが、質問させていただきます。 現在Windows XPにて他のサイトにあった「poweroff.vbs」 --------- Set objSystemSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}").InstancesOf("Win32_OperatingSystem") For Each objSystem In objSystemSet objSystem.Win32Shutdown 8 Next) --------- を、使用しタスクで自動シャットダウンをしていますが、 シャットダウンをさせるより先に任意のプログラム(.exe)を終了させてから上記の「poweroff.vbs」を実行するにはどうしたらいいでしょうか? このプログラムに何か記述を追加すれば良いのか、そのほかの方法があるのか、わかりません。ご回答をお願い致します。 因みに私はプログラムに関しては無知なので、わかりやすくお願い致します。

  • vbscriptについて

    vbsのファイルをダブルクリックするとシャットダウン・再起動・ログオフできるプログラムをネットで見つけました。 でも、休止状態にするプログラムがなかったのでどなたか知っていたら教えてください。 ちなみに再起動のプログラムです↓ ------------------------------------------------- Option Explicit Dim objShut ' シャットダウンオブジェクト Dim objOS ' オペレーティングシステムオブジェクト Dim objSystem ' オペレーティングシステムオブジェクト Set objShut = GetObject("winmgmts:{impersonationLevel = impersonate, (Shutdown)}") Set objOS = objShut.InstancesOf("Win32_OperatingSystem") For Each objSystem In objOS objSystem.Win32Shutdown 2 Next --------------------------------------------------

  • VBAでプロセッサ情報を取得すると・・・

    XPを使っています。 システムプロパティでは 「Intel(R)Core(TM)2 Duo CPU E7500 @2.93GHz」 なのですが ------------------------------------------------ Sub プロセッサの情報を取得する() Dim システム, 各要素 As Variant Set システム = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_Processor") For Each 各要素 In システム With 各要素 Debug.Print "プロセッサ: " & .Name End With Next Set システム = Nothing End Sub ------------------------------------------------ VBAで上記コードをを実行すると、 「プロセッサ: Intel Pentium III Xeon プロセッサ」 が返ってきます。 どちらが正しいのでしょうか? そもそも バージョンは2003です。

  • Windows2003サーバのリソース監視が理解出来なくて・・・・悩んでいます。

    Windows2003サーバのリソース監視の仕方及び知識についておしえてください(いまいち調べてみても理解が進みません・・・) サーバのリソースの監視ですが、簡単に言うとどんな状態になったら危険というか問題があるということになるのでしょうか? コミットチャージが増えるとよくないということを聞いたことがあるのですが・・・ 物理メモリだとか仮想メモリだとか用語の定義も私の中ではいまいちです。 平易に解説いただけると大変うれしいです。 監視する際ずっと見ているわけにもいかないですよね。 AD上にあるサーバーとしてVBScriptなどで自分のPCから見れればいいかなとは思います。 こんなプログラムとかを見つけたのですが・・・うまく使えなかったです。。。 Set OSInfos = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_OperatingSystem") For Each OSInfo In OSInfos Wscript.Echo "コミットチャージ: " & int((OSInfo.SizeStoredInPagingFiles - OSInfo.FreeSpaceInPagingFiles) / 1024) & "MB" Next

  • スクリプト:特権を保有していません

    Const wshYes = 6 Const wshNo = 7 Const wshYesNoDialog = 4 Const wshQuestionMark = 32 Set objShell = CreateObject("Wscript.Shell") intReturn = objShell.Popup("再起動処理キャンセルしますか?(60秒以内)", _ 60, "再起動処理開始", wshYesNoDialog + wshQuestionMark) If intReturn = wshYes Then Wscript.Echo "再起動処理をキャンセルしました" ElseIf intReturn = wshNo Then Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Win32Shutdown(6) Next Wscript.Echo "再起動処理を実行しています。" Else Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems ObjOperatingSystem.Win32Shutdown(6) Next Wscript.Echo "タイムアウトです。再起動処理を実行しています。" End If とスクリプトをいただきましたが、特権を保有していません。コード 80041062 が表示されてしまいます。あいにく、ど素人のため特権を付与してあげる方法がわかりません。もしお分かりになるか いらっしゃいましたら、ご教示をお願いいたします。

  • リモートPCの情報取得について

    Windows2000から下のVBSを実行しますがうまくデータを取得できません。 取得先のPCもWinodows2000です。.NET Framework 1.1以上です。 ファイヤーウォールの類もありません。 どなたか教えて下さい。 ------------------------------------------------------ strComputer = "192.168.2.●●" Set wbemServices = GetObject("winmgmts:\\" & strComputer) Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration") For Each wbemObject In wbemObjectSet WScript.Echo "物理メモリの合計 (kb): " & wbemObject.TotalPhysicalMemory Next

  • リモートコンピュータの再起動を行うWScript

    リモートコンピュータの再起動を行うWScriptを作成しています スクリプトを実行すると、リモート先のマシンがXP(32bit)では実行されるのですが、windows7(64bit)では「書き込みできません:’GetObject’」とエラーが表示されスクリプトを正常に動作させることができませんでした。 windows7で動作しない原因がわかるかたおりましたら、ご教示のほどよろしくお願いいたします。 --------------------------------------------------- ....(省略) for i=0 to arg.count-1 set obj = GetObject("winmgmts:{impersonationLevel=impersonate,(RemoteShutdown)}//host-" & arg(i)) obj.ExecQuery("select * from Win32_OperatingSystem where Primary=true").Reboot() next --------------------------------------------------- ※ソースはここから拾ってきました http://technet.microsoft.com/ja-jp/library/bb742445.aspx#ID0EQFAC

  • VBA Windows8 MACアドレス取得

    Windows7(32bit)の場合、次のコードでMACアドレスを取得できたのですが、 Windows8(64bit)の場合は失敗…ご教授宜しくお願い致します。 'マックアドレス:最初の1個だけ調べる。 Sub MacAddress() Dim oNetwork As Object Dim wNetworkSql As String wNetworkSql = "Select * From Win32_NetworkAdapter Where MACAddress Is Not Null" For Each oNetwork In GetObject("winmgmts:").ExecQuery(wNetworkSql) MsgBox oNetwork.MacAddress Exit For Next End Sub

  • シャットダウンスクリプトの記述

    ドメインに参加している WinXP クライアントから、ワークグループ環境の複数台の Windows Server 2003 (主に) に対して ping を実行し、ping に対して応答があった場合はシャットダウンするスクリプトを記述したいと考えています。 # ワークグループ環境の Windows Server 2003 は検証環境で、社内セキュリティポリシーの運用上ドメインに参加できません。 この場合、 1. 複数のマシンに ping を打つ 2. 1 で応答がかえってくれば管理者の資格情報を使用してログイン 3. シャットダウンを実行 という流れになると思います。 そして、最終的には 1 が成功した場合に If 構文で 2、および、3 を実行する、という ように書けば一連の処理は成功すると考えています。 現在上記 1~3 の処理で細分化し、それぞれについて動作確認をとっています。 しかし、2、および、3 を実行してもうまくいかないため、これらについて伺いたく 質問させていただきます。 2 について 以下の構文を組んでいますが、vbs を実行すると、後述のエラーダイアログが表示されます (対象 PC やアカウント名などはダミーとご認識ください)。 別の資格情報 (接続先マシンの管理者アカウント) を指定して接続できるコードをご教授ください。 ----- Const WbemAuthenticationLevelPktPrivacy = 6 strComputer = "atl-ws-01" strNamespace = "root\cimv2" strUser = "Administrator" strPassword = "4rTGh2#1" Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objwbemLocator.ConnectServer (strComputer, strNamespace, strUser, strPassword) objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy Set colItems = objWMIService.ExecQuery ("Select * From Win32_OperatingSystem") For Each objItem in ColItems Wscript.Echo strComputer & ": " & objItem.Caption Next ----- エラー : RPC サーバーを利用できません。 コード : 800706BA ソース : SWbemLocator 3 について 以下の構文を組んでいますが、エラーは表示されないものの、シャットダウンが開始されません。 ----- On error resume Next Const LogOff = 0 'ログオフ Const REBOOT = 2 '再起動 Const SHUTDOWN = 8 'シャットダウン Dim objWMIService Dim colOperatingSystems Dim objOperatingSystem Set objWMIService = GetObject("winmgmts:{impersonationLevel= impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems objOperatingSystem.Win32Shutdown(SHUTDOWN) Next Set objWMIService = Nothing Set colOperatingSystems = Nothing Call ErrorCheck End Function ----- また、試しに objNetwork.MapNetworkDrive を使用してサーバーの IPC$ に接続しログインした後に上記処理を試行しましたが、 シャットダウンが進みませんでした。 何卒よろしくお願いいたします。

  • VBSについて教えてください。

    VBSについて教えてください。 イベントビューワのプロパティの変更(最大ログサイズとログサイズが最大値に達した時の操作)を以下のスクリプトにて変更したいと思っています。(スクリプトはhttp://www.microsoft.com/japan/technet/scriptcenter/scripts/logs/eventlog/lgevvb16.mspxで公開されているのを利用しています。) strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" & _ strComputer & "\root\cimv2") Set colLogFiles = objWMIService.ExecQuery _ ("Select * from Win32_NTEventLogFile") For each objLogfile in colLogFiles strLogFileName = objLogfile.Name Set wmiSWbemObject = GetObject _ ("winmgmts:{impersonationLevel=Impersonate}!\\.\root\cimv2:" _ & "Win32_NTEventlogFile.Name='" & strLogFileName & "'") wmiSWbemObject.MaxFileSize = 1024000 wmiSWbemObject.OverwriteOutdated = 0 wmiSWbemObject.Put_ Next WindowsXPSP2では動作したのですが、Windows2000SP4では以下のエラーが発生します。 Windows Script Host スクリプト:スクリプトの場所 行:14 文字:5 エラー:WBEM_FLAG_USE_AMENDED_QUALIFIERSが指定されていない場合は修正オブジェクトを置くことはできません コード:80041066 ソース:SWbemObject VBSについては全く理解できておりません。 Windows2000で動作させるためにんはどこを修正すればいいでしょうか?

専門家に質問してみよう