ラベル WMI の投稿を表示しています。 すべての投稿を表示
ラベル WMI の投稿を表示しています。 すべての投稿を表示

2015年9月17日木曜日

◆svchostでホストされているサービスを表示する

Analyzing svchost Processes - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

 

サービスとプロセスをぶつけてsvchostでホストされているサービスを一覧表示する。(Ver3)

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018

$service = @{
  Name 
= 'Service'
  Expression =
 
    {
     
if ($_.Name -eq 'svchost'
)
      {
      
$processID = $_.
ID
       (
$serviceList.$processID).Name -join ', '
      }
    }
}


$serviceList = gwmi -Class Win32_Service |
  group -Property ProcessID -AsString -AsHashTable

ps |
  Select -Property Name, ID, CPU, $service |
  Out-GridView

image

2015年7月24日金曜日

◆対話ログオンしているユーザーを表示する(RDP含む)

Finding Logged On Users - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

前回は物理的に対面でログオンしているユーザーの表示だったが、今度はリモートデスクトップを含んだログオンユーザーの表示。

gwmi -Class Win32_LogonSession  | % {
  $_.GetRelated('Win32_UserAccount') |
  select -expandp caption |
  select -unique
}

ただ、試してみた感じだとログオフせずに切断した情報とかが残って表示されている様な気もする・・・。

以前UPしたPowerShell: ◆ログオンしているユーザーを表示するのほうが純粋に今の情報に近い様な気がする。(詳しくは調べてみないと判らない・・・)

2015年7月23日木曜日

◆対話ログオンしているユーザーを表示する

Find Physically Logged On User - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

へぇー、確かにリモートログオンの場合は表示されない・・・。

>Get-WmiObject -Class Win32_ComputerSystem | select username

2014年11月7日金曜日

◆コンピュータの説明を設定する

コンピュータの説明とは以下の部分。

image

 

>$op = gwmi Win32_OperatingSystem
>$op.Description = "仕事用コンピュータ"
>$op.Put()

 

Set-WmiInstanceを使ってもできる。

が、ヘルプを見ると以下のような感じで出来そうなのだが、旨くいかない。

>Set-WmiInstance -Class Win32_OperatingSystem -arguments @{Description="会社のコンピュータ"}

 

Set-WmiInstance : サポートされていないパラメーターです
発生場所 C:\Users\kumagai_mitsugu\AppData\Local\Temp\b67c3bf9-5b3d-4e70-bd99-d0ace79a285f.ps1:1 文字:16
+ Set-WmiInstance <<<<  -Class Win32_OperatingSystem -arguments @{Description="会社のコンピュータ"}
    + CategoryInfo          : InvalidOperation: (:) [Set-WmiInstance]、ManagementException
    + FullyQualifiedErrorId : SetWMIManagementException,Microsoft.PowerShell.Commands.SetWmiInstance

仕方が無いので、とりあえずこんな感じで。

>gwmi Win32_OperatingSystem | Set-WmiInstance -arguments @{Description="会社のコンピュータ"}

2013年7月26日金曜日

◆スクリーンセーバーの情報を取得する

Finding Screen Saver Information - Power Tips - PowerShell.com – PowerShell Scripts, Tips, Forums, and Resources

001
002
003
004
005
006
007

gwmi win32_desktop | ?{$_.name -eq "NT AUTHORITY\SYSTEM"}

gwmi win32_desktop -filter "name='NT AUTHORITY\\SYSTEM'"

gwmi win32_desktop -Filter "name='$env:userdomain\\$env:username'"

[wmi]"win32_desktop='NT AUTHORITY\SYSTEM'"

基本的にはどの行も同じ結果が表示される。
image

「¥」の扱いにちょっと注意が必要。
WMIの世界ではエスケープが必要で、PowerShellの世界ではエスケープが不要って事かな。

2013年6月3日月曜日

◆所属するドメインユーザーグループを表示する

>([wmi]"Win32_userAccount.Domain='ad',Name='hogeUser'").GetRelated('Win32_Group')

image

ローカルマシン上のグループにも属している場合は、ローカルグループも表示される。

2013年3月7日木曜日

◆電源プランを設定する

今の電源プランを確認するには、

>Get-WmiObject -Name root\cimv2\power -Class Win32_PowerPlan | select elementname,description,isactive

image

変更するには、

>(Get-WmiObject -Name root\cimv2\power -Class Win32_PowerPlan -Filter 'ElementName="高パフォーマンス"').Activate()

2013年2月28日木曜日

◆ローカルユーザーアカウントを列挙する

001
gcim win32_useraccount -Filter "LocalAccount='true'"

image

gwmiを使っても基本的には同じ。

2013年2月4日月曜日

◆リモートマシンのドライブにデフラグが必要か調べる

PowerShell: ◆各ドライブにデフラグが必要か調べるのリモート版。

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018

function DefragAnalysis($computer)
{
 
gwmi win32_logicaldisk -Filter DriveType=3 | %
{
   
$drive = $_.
DeviceID
   
$disk =
 
     
gwmi win32_volume -Filter "DriveLetter='$drive'" -Comp $computer
    $def = 1 | select ComputerName,Drive,DefragRecommended
    $def.ComputerName = $computer
    $def.Drive = $drive
    $def.DefragRecommended =
 
      (
Invoke-WmiMethod -Path $($disk.
__PATH)  `
          
-Name DefragAnalysis).
DefragRecommended
   
$def
  } 
}


$computers = "sv01","sv02","sv03"
$computers | %{DefragAnalysis $_} | ft -AutoSize

「Win32_volume」オブジェクトの「DefragAnalysis」メソッドを「Invoke-WmiMethod」で呼ぶ。

ただし、リモートに対してオブジェクトを渡せないので「__PATH」プロパティに持っているシリアライズされた情報を渡すって感じでしょうか。

image

2013年2月1日金曜日

◆各ドライブにデフラグが必要か調べる

Win32_VolumeのDefragAnalysisメソッドが使える。

001
002
003
004
005
006
007
008

gwmi win32_logicaldisk -Filter DriveType=3 | %{
 
$drive = $_.
DeviceID
 
$disk = gwmi win32_volume -Filter "DriveLetter='$drive'"
  $def = 1 | select Drive,DefragRecommended
  $def.Drive = $drive
  $def.DefragRecommended = ($disk.DefragAnalysis()).
DefragRecommended
 
$def
} | ft -auto

image

2013年1月31日木曜日

◆リモートマシンに共有フォルダを作る

リモートのマシンに共有フォルダを作るサンプルがあったのでメモしておく。

001
002
003
004
005
006
007
008
009
010

$Path = 'C:\tools'
$Name = 'tools'
$Type = 0
$Maximumallowed = 5
$Description = 'PowerShell Share test'
$ComputerName = 'mtg8'
$rv = Invoke-WmiMethod -Path 'Win32_Share'
 `
 
-ComputerName $ComputerName -Name Create
 `
 
-ArgumentList $null,$Description,$MaximumAllowed,$Name,$null,$Path,
$Type
$rv
.ReturnValue

これを実行すると以下のような共有が作られる。

image

ただしこの「Create」メソッドが何者なのか今一つ良く判らない。
以下のメソッドだとは思うのだが、パラメータの順番が一致していないように見える。

image

調べてみたところ以下のようにすると順番が表示できるようだ。(CreateはStaticのようです)

001
002

([wmiclass]"win32_share").PSBase.
GetMethodParameters("Create").Properties | ft name,type -auto

image

2013年1月22日火曜日

◆メモリーサイズを調べる

最近見た情報によると、Ver3のヘルプ日本語化はあと3か月から半年以内に完了するらしいとのこと。

日本語化されないならされないで英語を読もうかと思っていたが、日本語化されるのならばそれほど急ぐ理由もないので待っていようかと思う。

surfaceが未だに日本で発売されなかったり、WindowsPhoneも発売されなかったりと、日本のプライオリティが下がってしまったのですかね・・・。

当面は、これまでメモしてあったブログに載せるまでではないかなっと思っていた情報をちょこちょこUPしていこうかと思っています。

単にどこかで見かけてメモしてあるだけなので自分自身消化できていないものもあります。

 

という訳でまずは、「メモリーの情報を表示する」。
WMIから引っ張ってくるだけ。
コード情報をMSのサイトから見つけるのがちょっと面倒って所だろうか。

フリーソフトとかを使えばメモリーのみならず各種詳細情報を取得できるので普通はそちらを使うが、複数のPCの情報を纏めてとなるとここら辺が有効になるかも。

001
002
003
004
005
006
007
008
009
010
011
012

$memorytype = "Unknown", "Other", "DRAM", "Synchronous DRAM", "Cache DRAM",
"EDO", "EDRAM", "VRAM", "SRAM", "RAM", "ROM", "Flash", "EEPROM", "FEPROM",
"EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR-2","DDR-3"
$formfactor = "Unknown", "Other", "SIP", "DIP", "ZIP", "SOJ", "Proprietary",
"SIMM", "DIMM", "TSOP", "PGA", "RIMM", "SODIMM", "SRIMM", "SMD", "SSMP",
"QFP", "TQFP", "SOIC", "LCC", "PLCC", "BGA", "FPBGA", "LGA"
$col1 = @{Name='Size (GB)'; Expression={ $_.Capacity/1GB } }
$col2 = @{Name='Form Factor'; Expression={$formfactor[$_.FormFactor]} }
$col3 = @{Name='Memory Type'; Expression={ $memorytype[$_.MemoryType] } }

Get-WmiObject Win32_PhysicalMemory |
 
 
ft BankLabel, $col1, $col2, $col3,Speed -auto

image

積んであるのはDDR2の400MHzという化石のようなスペック(TT)

Speedが800で表示されるのはデュアル動作だからって事だろうか。

2012年8月18日土曜日

◆ネットワークアダプター(NIC)をリセットする

古いPCにWindows8を入れたら、スリープからの復帰時にNICが有効にならなくなってしまったのでリセットするコマンドを作った。

001
002
003
004
005
006
007
008
009
010
011
012
013

function Reset-NetworkAdapter {
 
param
(
 
$name
  )

 
$nc = Get-WmiObject Win32_NetworkAdapter -Filter "NetConnectionID='$name'"
 
 
if($nc.Disable().ReturnValue){"Error in Disable"
}
 
if($nc.Enable().ReturnValue){"Error in Enable"
}
}


$netName = "イーサネット"

Reset-NetworkAdapter $netName

Windows8は、7の後継としては若干使いづらい印象。
特に、一般ユーザーは7の後継ではなく、タブレット用のOSと捉えたほうが良さそう。
Heper-Vは超嬉しいが、今のHDでは動かない(><)

ビジネスユーザーは7のままが幸せ。
開発者とタブレットユーザーは8が良いと思われる。

9あたりで7ユーザーに少し歩み寄ってくれるのではなかろうか・・・。

2012年7月1日日曜日

◆スリープ時にiPod装着をチェックする

半年ほど前からiPodシャッフルを使っている。
安くてコンパクトで気に入っているのだが、USBに繋いで充電したままPCをスリープさせてしまうと逆に放電されてしまう。

朝気づくと充電がスッカラカンという事をなんどかやらかして、何かしら対策しないといけないと思い立った。(繋いでいるPCのUSBに依存した現象なのかもしれないが・・・)

スリープイベントを拾ってiPodがつながっていたら警告、って事にすれば良さそうだ。

Get-PSDriveでドライブ情報を取ってきてiPodかどうかを判定すれば良い。
幸い、DescriptionにiPodの名前が入っている。

っと思ったのだが、どうにもこうにもこいつが不思議な動作をする。
Descriptionに名前が入っている時と入っていない時があるのだ。
接続の都度違うとかではなくて、Get-PSDriveを呼ぶ都度?(環境)に違ったりする。
結局法則性がつかめなかったのでGet-PSDriveは諦めて「win32_usbhub」を使うことにした。

イベント自体は以前も使っているので以下と同様にしてみた。
PowerShell: ◆スリープ(Sleep)解除イベントを拾う

</
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032

#requires -version 2.0
#
# Sleep時にiPod接続の監視
#

$iPodString = "Apple Mobile Device USB Driver"
$identifier = "EnteringSuspend"
$query =
 
 
"Select * From Win32_PowerManagementEvent where EventType=4"
Register-WmiEvent -query $query -sourceidentifier $identifier 

try
{
 
While($true
){
   
$newEvent = Wait-Event -SourceIdentifier $identifier
    if(gwmi win32_usbhub | ?{$_.name -eq $iPodString
}){
     
$sam = New-Object -comObject SAPI.SpVoice
      $sam.Speak("i Pod is connecting."
 )
    }
       
   
Get-Event -SourceIdentifier $identifier | Remove-Event
     
  }
}

catch
{
   
Write-Warning "以下のエラーが発生しました"
    $error[0]
}
finally
{
   
#イベントを削除し購読をやめる
    Get-Event $identifier | Remove-Event
    Get-EventSubscriber -sourceidentifier $identifier |
 
     
Unregister-Event
}

警告は音声を使ってみたが、ココらへんは好みに応じて変更すれば良いだろう。

基本的にはUSBメモリーの抜き忘れなどにも使えそうなので用途はありそうだ。

2012年6月11日月曜日

◆svchostプロセスのサービスを纏めて表示する

タスクマネージャでプロセスタブを見ていると「svchost」なるプロセスをたくさん見かける。

image

説明を見ると「Windowsサービスのホストプロセス」とある。
即ち、これらのプロセスが各種Windowsのサービスをホストしているという事になる。

それぞれのプロセスがどんなサービスをホストしているかは、該当プロセスを右クリックして表示されたコンテキストメニューから「サービスの表示」を選んであげると以下の様に表示される。
image

image

これを見ると、1つのプロセスが複数のサービスをホストしていることが判る。

 

次に、これらを纏めてPowerShellで表示させてみたのが以下のスクリプトである。

001
002
003
004
005

Get-WmiObject -Class Win32_Service | sort ProcessID | %{
 
if((Get-Process -Id $_.ProcessID).ProcessName -eq "svchost"
){
   
Write-Host $_.ProcessID $_.displayname 
  }
}

「Get-Service」コマンドレットではプロセスIDが見当たらなかったので、「Win32_Service」を使っている。
それ以外は特別なところは無い。

image

2012年5月17日木曜日

◆ログオンしているユーザーを表示する

ログオンしていると必ず「Explorer」のプロセスが使用されるので、そのユーザーを一覧表示するという仕組み。

001
002
003
004

Get-WMIObject Win32_Process -filter 'name="explorer.exe"' | 
 
% { $owner = $_.
GetOwner()
     
'{0}\{1}' -f $owner.Domain, $owner.
User 
    } 
| Sort-Object -Unique

image

2011年9月1日木曜日

◆Hyper-Vの仮想マシンをバックアップする

仮想マシンをシャットダウンして、バックアップして、再び起動するというスクリプトを作ってみた。

標準ではPowershellからVMを操作するコマンドはなぜか用意されていない。
そこで、PowershellからVMを操作するにはWMIを使用するか、CodePlexで提供されているツールを使うか、システムセンターを使うかなのだそうだ。
ここらへんの話は以下の記事で詳しく解説してある。
【ハウツー】【管理効率化への挑戦】PowerShellで仮想環境も管理!! Hyper-V、SCとの連携 (1) Hyper-Vマネージャの問題点 | エンタープライズ | マイコミジャーナル

今回はバリバリ仮想マシンを操作するわけではないので、追加モジュールの必要ないWMIを使うことにした。

function main
{
    $ErrorActionPreference = "STOP"

    $VMName = "GSG-SVV2"
    $VMQuery = "SELECT * FROM Msvm_ComputerSystem WHERE ElementName='$($VMName)'"
    $VMObj = gwmi -Query $VMQuery -Namespace "root\virtualization" -Computername "."
   
    Write-Output "■仮想マシン($($VMName))バックアップ開始:$(Get-Date)▼▼▼▼▼▼▼▼"
    if($VMObj.EnabledState -eq 2)
    {
        shutdown-vm
        Start-Sleep 300
    }
    bkupcopy
    startup-vm
    Write-Output "■仮想マシン($($VMName))バックアップ終了:$(Get-Date)▼▼▼▼▼▼▼▼"
   
    trap{
      Send-MailMessage    -To "<vmuser@hoge.co.jp>"                     `
                    -From "VMServer <admin@hoge.co.jp>"            `
                    -Subject "VM Bkup Error"                     `
                    -SmtpServer "smtp.hoge.co.jp"                             `
                    -Body "仮想マシン($($VMName))バックアップエラー" `
                    -Encoding  ([System.Text.Encoding]::Default)
    }   
}

function shutdown-vm
{

    $STDObjQuery = "SELECT * FROM Msvm_ShutdownComponent WHERE SystemName='$($VMObj.name)'"

    $STDObj = gwmi -Query $STDObjQuery -Namespace "root\virtualization" -Computername "."
    $Result = $STDObj.InitiateShutdown($true,"バックアップ")
}


function bkupcopy
{
    $gen = [Math]::Floor(((Get-Date).DayOfYear/7))%3 + 1
    $bkupPath = "E:\仮想マシンバックアップ\gen$gen"
    if(Test-Path $bkupPath){cmd /C "rmdir /S /Q $bkupPath"}
    copy (Join-Path "D:\VM" $VMName) $bkupPath -force -Recurse
}

function startup-vm
{
    $VMObj.RequestStateChange(2)
}

. main >> c:\log\仮想マシンバックアップ.log 2>&1

毎週末に実行し、3世代管理することとした。(年初からの日数で週数を求めて世代としている)

コピーする前に前回のコピーをクリアしているのだが、PowershellのRemove-Itemを使うとなぜか上手く行かなかった。
どうも、非同期に動作して次行のCopyとぶつかるような動作をしてしまうのだ。
それで止む無くDOSコマンドを使ってクリアしている。

仮想マシンのステータスはこんな感じらしい。

Enabled (Turns the VM on) : 2
Disabled (Turns the VM off) : 3
Reboot (A hard reset of the VM) : 10
Reset (For future use) : 11
Paused (Pauses the VM) : 32768
Suspended (Saves the state of the VM) : 32769

起動時はこのステータスを2にしてあげれば良いのだが、シャットダウンは3にすれば良いというものでもないらしい。
(シャットダウンオブジェクトを取得してそのメソッドを呼び出している)

また、シャットダウンは非同期に動くようなのでとりあえずSleepを噛ませている。

2011年7月1日金曜日

◆サービスのログオンアカウントを取得、抽出

Get-Serviceコマンドレットではログオンアカウントが拾えないっぽい。
そこで、WMIオブジェクト(Win32_Service)を使って取得する。

PS>gwmi win32_service | select name,startname | group startname

Count Name                      Group
----- ----                      -----
   94 localSystem               {@{name=AeLookupSvc; startname=
   52 NT AUTHORITY\LocalService {@{name=ALG; startname=NT AUTHO
   28 NT AUTHORITY\NetworkSe... {@{name=aspnet_state; startname


PS>

 

抽出するにはFilterを掛けてあげれば良い。

PS>gwmi Win32_Service -Filter "startname='LocalSystem'" | select -First 3


ExitCode  : 0
Name      : AeLookupSvc
ProcessId : 364
StartMode : Manual
State     : Running
Status    : OK

ExitCode  : 0
Name      : AppHostSvc
ProcessId : 1364
StartMode : Auto
State     : Running
Status    : OK

ExitCode  : 1077
Name      : Appinfo
ProcessId : 0
StartMode : Manual
State     : Stopped
Status    : OK

抽出文字列に\がある場合はエスケープが必要なようなので注意が必要だ。

PS>gwmi Win32_Service -Filter "startname='NT AUTHORITY\\LocalService'"


ExitCode  : 1077
Name      : ALG
ProcessId : 0
StartMode : Manual
State     : Stopped
Status    : OK

ExitCode  : 1077
Name      : AppIDSvc
ProcessId : 0
StartMode : Manual
State     : Stopped
Status    : OK

2011年3月29日火曜日

◆スリープ(Sleep)解除イベントを拾う

PCの世界でも節電が最重要課題だ。
スリープ機能を使えば節電出来るのは判っているが、経験上スリープを使うと様々な不具合に見舞われる。

メーカー製ノートPC等はハード的に対応が進んでいて問題は出づらいだろうがデスクトップPCになるとまだまだ?

特に追加機器を接続していたりすると顕著に地雷を踏む。

私もこのご時世なのでスリープ設定をしてみた。
Windows7はスリープに入るのも戻るのも非常に素早く快適だ。

っと思っていたのもつかの間、やはり不具合はやってきた。
ロジクールマウスにアサインしている機能が効かなくなる。(結構以前からある問題のようだ)
しかもどの機能が効かなくなるかはその時々で違う。

ん~、日本のために我慢して使うかとも思ったのだが、ここらへんは作業効率にシビアに効いてくる部分なのでかなりストレスが溜まる。

調べてみるとSetPoint(ロジクールのマウスウェア)を再起動してやれば直るらしい。

それなら、スリープ復帰のイベントを拾って再起動してあげればOKじゃん。

という訳でWMIでそれっぽい物を探す。
すると、まさにそれっぽいWin32_PowerManagementEventなんてのがある。

PS>Get-WmiObject -List *power*


   NameSpace: ROOT\cimv2

Name
----
Win32_PowerManagementEvent
CIM_PowerSupply
CIM_UninterruptiblePowerSupply
Win32_PerfFormattedData_PowerMet...
Win32_PerfRawData_PowerMeterCoun...

ネットでこいつを調べたところEventType=7がスリープ復帰(Resume)イベントらしい。
イベントの扱い方は以前PowerShell: ◆プロセスの開始終了を監視する(Register-WmiEvent、Get-Event)でやっているのでこいつを真似してスリープ復帰時にSetPointを再起動するスクリプトが以下である。

</TBOD
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029

#requires -version 2.0
#
# Sleep解除の監視
#


$query = "Select * From Win32_PowerManagementEvent where EventType=7"
Register-WmiEvent -query $query -sourceidentifier "Resume" 

try
{
   
While($true
){
       
$newEvent = Wait-Event
        $sp = Get-Process SetPoint
        $path = $sp.
path
       
$sp.
Kill()
           
       
Get-Event | Remove-Event
       
       
& $path
    }
}

catch
{
   
Write-Warning "以下のエラーが発生しました"
    $error[0]
}
finally
{
   
#イベントを削除し購読をやめる
    Get-Event | Remove-Event
    Get-EventSubscriber | Unregister-Event
}

あとはこれを、スタートアップなりスケジューラなりで実行して上げれば良い。
私は、キックする起動ファイルを作りたくなかったのでタスクスケジューラに登録した。
image

引数は以下のように指定してみた。
-WindowStyle Hidden -file "D:\PS\Sleep解除の監視.ps1"

 

その後確かめてみたらSetPoint自体は最新(Ver6.20)にバージョンアップしたら不具合は直っていた(^^;