Remove-Service コマンドレットがなくたって・・・

 

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にも感謝したいと思います。

コメント

  1. HIRO より:

    Remove-Serviceですか。

    確かにあっても良いかもしれませんね。

    とりあえずはけろさんが示してくれたコードをRemove-Serviceとして関数化すれば使えるわけですね!

    最近いいネタが多すぎるので、早いとこnoraさんから提案のあったリポジトリを構築したいところです。

  2. けろ-みお より:

    >HIROさん

    実は、職場の方から「Remove-Serviceコマンドレットがない!」と指摘されまして、
    調べてみたところ、ネタになってしまった感じですね。

    確かに、最近、記事のレベルが上がってきているので、リポジトリ構築が急務かもしれませんね。
    お互い頑張りましょう!

  3. mcmug より:

    そういえばRemoveがないのは非対称ですね・・・

    WMIインスタンスの取得は
    Get-WmiObject win32_service -Filter "Name = ‘<サービス名>’"
    とか
    [WMI]’win32_service.name="<サービス名>"’
    のような書き方もできるのですね。
    (と Windows PowerShell Cookbook で知りました・・・)

  4. けろ-みお より:

    > Get-WmiObject win32_service -Filter "Name = ‘<サービス名>’"
    > [WMI]’win32_service.name="<サービス名>"’

    あ!こっちの書き方の方がGoodですね!
    後で訂正しておきますね!ご指摘ありがとうございます。
    (まだまだ表現方法が勉強不足です・・・)

タイトルとURLをコピーしました