Показать полную графическую версию : [решено] Удаление служб по маске
kirillius
03-12-2019, 14:00
Здравствуйте.
Просьба помочь в написании скрипта по удалению служб по маске.
Например, есть список служб типа: service_1, service_2 и т.д.
Необходимо удалить все службы с именем service_*
DJ Mogarych
03-12-2019, 15:05
Powershell, должно работать:
(get-service service_*).name.foreach({sc.exe delete $_})
опять нет виндовой машины под рукой, но на пошике это делается +- ванлайном
Get-Service "service_*" | Remove-Service
насчет маски не уверен т.к. пишу по памяти
Однако должен отметить что удаление служб вижу весьма сомнительным действием.
DJ Mogarych
03-12-2019, 15:13
Elven, Remove-Service появился только в Powershell v.6.
А был бы в общеупотребительных версиях, наверное, можно было бы так:
Remove-Service "service_*"
:)
kirillius
03-12-2019, 15:27
Powershell, должно работать: »
Не работает.
Нельзя вызвать метод для выражения со значением NULL.
строка:1 знак:40
+ (get-service AmmyyAdmin_*).name.foreach <<<< ({sc.exe delete $_})
+ CategoryInfo : InvalidOperation: (foreach:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Get-Service "service_*" | Remove-Service »
Тоже не работает
Нельзя вызвать метод для выражения со значением NULL.
строка:1 знак:40
+ (get-service service_*).name.foreach <<<< ({cmd.exe /c "sc delete $_"})
+ CategoryInfo : InvalidOperation: (foreach:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Возможно маска неправильная, в имени службы вместо звёздочки может быть от 4 до 6 символов
DJ Mogarych
03-12-2019, 15:36
kirillius, Remove-Service появился только в Powershell v.6. »
У вас какая версия powershell?
Команда
$psversiontable
Можно вот так попробовать, если версия старая:
(get-service service_*).name |foreach {sc.exe delete $_}
Нельзя вызвать метод для выражения со значением NULL. »
Вы уверены, что у вас существуют службы с именами service_*? Что показывает
get-service service_*
?
kirillius
03-12-2019, 15:42
$psversiontable »
CLRVersion 2.0.50727.8806
BuildVersion 6.1.7601.17514
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
DJ Mogarych
03-12-2019, 16:43
Да, это очень старая версия.
Так работает?
(get-service service_*).name |foreach {sc.exe delete $_}
DJ Mogarych, а Wbem — Win32_Service → .Delete() (мне пробовать не на чем — нет «лишних» служб), не?!
Не работает. »
Метод .foreach() появился позже версии 2.0, которая у Вас (можете смело обновиться как минимум до версии 5.1, если у Вас Windows 7/Server 2008 R2 и выше).
kirillius
05-12-2019, 16:00
Так работает? »
Нет, не получилось
Описание:
Удаление записи службы из реестра.
Если служба запущена либо для нее открыт дескриптор
другим процессом, эта служба будет помечена
для удаления.
Использование:
sc <сервер> delete [имя службы]
get-service service_* »
Ну "service_*" я привёл для примера. Если подставить то что реально нужно, выводит список служб по маске.
При проверке скрипта я разумеется меняю всё на то как нужно.
megaloman
05-12-2019, 16:59
Maska = "^winsolit_.*$"
Set ProcL = GetObject("winmgmts:").ExecQuery("Select * From Win32_Process")
With CreateObject("VBScript.RegExp")
.Pattern = Maska
.IgnoreCase = True
.Global = True
For Each iProc In ProcL
If .Test(iProc.Name) Then
iProc.Terminate
End If
Next
End With
MsgBox "Done"Единственное, написать регулярку
Тестировал на старой игре winsolit
Скопировал несколько раз exe с разными именами и запустил их.
DJ Mogarych
05-12-2019, 17:19
Если служба запущена либо для нее открыт дескриптор
другим процессом, эта служба будет помечена
для удаления. »
Ну давайте будем из вас информацию клещами тащить.
Служба остановлена?
Нет ли там дескрипторов от других процессов?
(get-service service_*).name |foreach {
stop-service $_
sc.exe delete $_
}
kirillius
06-12-2019, 15:27
(get-service service_*).name |foreach {
stop-service $_
sc.exe delete $_
} »
Не удается привязать аргумента к параметру "Name", так как он имеет значение NULL.
Все службы по данной маске остановлены. Также, по одиночке они спокойно удаляются из cmd путём sc delete.
Скрипт выше тоже удалил службу, когда я вместо маски прописал полное её имя.
DJ Mogarych
06-12-2019, 18:48
Какой-то из этих вариантов работает?
get-service service_*
get-service "service_*"
get-service service*
kirillius
09-12-2019, 14:11
Какой-то из этих вариантов работает? »
Работают все. Выводится список служб.
DJ Mogarych
09-12-2019, 14:39
Хорошо. А такие варианты?
(get-service service_*).name
get-service service_* |select -expand name
kirillius
10-12-2019, 09:33
Хорошо. А такие варианты? »
Тоже отработало.
DJ Mogarych
10-12-2019, 10:00
Интересное кино.
А так работает?
$services = get-service service_*
foreach ($service in services) {
stop-service $service
sc.exe delete $service.name
}
kirillius
10-12-2019, 10:21
$services = get-service service_*
foreach ($service in services) {
stop-service $service
sc.exe delete $service.name
} »
Ошибок не пишет (вообще ничего не пишет), но службы не удаляет.
Интересное кино.
А так работает? »
Отличная демонстрация того, что все эти "хакерские" выверты и прочая магия допустимы в интерактивном режиме. А скрипты надо писать однозначно.
kirillius, попробуйте добавить в цикл вывод найденных сервисов
у Stop-Process укажите явно, что вы передаёте, а не надейтесь на приведение типов
внешние файлы вызывайте либо командлетом Start-Process либо оператором контекста &
примерно так
$services = get-service service_*
foreach ($service in $services) {
write-verbose $service.name -Verbose
stop-service -InputObject $service
& sc.exe delete $service.name
}
а на самом деле просто потерян $ перед services
и этого бы не случилось, если бы не городили на пустом месте кучу переменных, а писали бы конвейером
p.s. и в общем случае оно не будет работать - сломается на службах с пробелом в имени
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.