Windows Service 関連のコマンドレットを調べてみる
> gcm *-service | select name
Name
----
Get-Service
New-Service
Restart-Service
Resume-Service
Set-Service
Start-Service
Stop-Service
Suspend-Service
ぬわんと!Remove-Service がない!
SCM(Service Control Manager)とWMIとの間に何か問題が生じ、 Remove-Serviceコマンドレットをサポートしなかったのか?
ただ単純に忘れてしまったのか?もしくは、PowerShellの特性上、作れなかった理由があるのか?
他で代替えが効くと思って用意しなかったのか?
それはわかりませんが、別に、Remove-Serviceコマンドレットがなかったとしても、
SCMアクセス権限さえあれば、 該当サービスを簡単に消すことができます。
方法1:そのまま「sc.exe delete サービス名」をPowerShell上で実行してしまう
方法2:PowerShellでWMI(Win32_Service) を操作し、サービスを削除する
$service = Get-WmiObject win32_service | Where-Object {$_.Name -eq "サービス名"}
$returnValue= $service.delete()
昔は、SCMにアクセスするのに、Windows APIじゃないと出来なかったんですが、 WMIのおかげでだいぶ操作しやすくなりましたね。
WMIの操作をサポートしてくれた、PowerShellにも感謝したいと思います。
コメント
Remove-Serviceですか。
確かにあっても良いかもしれませんね。
とりあえずはけろさんが示してくれたコードをRemove-Serviceとして関数化すれば使えるわけですね!
最近いいネタが多すぎるので、早いとこnoraさんから提案のあったリポジトリを構築したいところです。
>HIROさん
実は、職場の方から「Remove-Serviceコマンドレットがない!」と指摘されまして、
調べてみたところ、ネタになってしまった感じですね。
確かに、最近、記事のレベルが上がってきているので、リポジトリ構築が急務かもしれませんね。
お互い頑張りましょう!
そういえばRemoveがないのは非対称ですね・・・
WMIインスタンスの取得は
Get-WmiObject win32_service -Filter "Name = ‘<サービス名>’"
とか
[WMI]’win32_service.name="<サービス名>"’
のような書き方もできるのですね。
(と Windows PowerShell Cookbook で知りました・・・)
> Get-WmiObject win32_service -Filter "Name = ‘<サービス名>’"
> [WMI]’win32_service.name="<サービス名>"’
あ!こっちの書き方の方がGoodですね!
後で訂正しておきますね!ご指摘ありがとうございます。
(まだまだ表現方法が勉強不足です・・・)