1

Тема: AHK: изменения типа запуска сервиса через WMI

Собственно проблема: при выполнении кода ошибка (19) : ==> Blank parameter Specifically: .Change(, , , ,"Disabled")

msgbox % GetModuleExeName(PID)

GetModuleExeName(p_id) {
        for service in ComObjGet("winmgmts:").ExecQuery("select * from win32_service WHERE DisplayName='TeamViewer 7'")
        errorreturncode:=service.Change(, , , ,"Disabled")
        
        return errorreturncode

}

Какие параметры необходимо передать что бы небыло ошибки, т.к. в оригинале на VB передаются пустые параметры:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & _
    strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where StartMode = 'Manual'")
For Each objService in colServiceList
    errReturnCode = objService.Change( , , , , "Disabled")
    WScript.Echo "Changed manual service to disabled: " & objService.Name   
Next

http://msdn.microsoft.com/en-us/library … s.85).aspx

2 (изменено: creature.ws, 2013-01-16 15:22:55)

Re: AHK: изменения типа запуска сервиса через WMI

; Требует права администратора.
SetServiceStartMode(serviceDisplayName, startMode) {
    WMI := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . A_ComputerName . "\root\cimv2")
    ServiceList := WMI.ExecQuery("SELECT * FROM Win32_Service WHERE DisplayName='" . serviceDisplayName . "'")

    for Service in ServiceList
        return Service.ChangeStartMode(startMode)
}

MsgBox % SetServiceStartMode("TeamViewer 7", "Disabled")

Почему функция названа GetModuleExeName? Почему обязательный параметр p_id не используется?
Здравый смысл никто не отменял

Пустые параметры в методы COM объектов в ahk передаются с помощью ComObjMissing().

3 (изменено: chippp, 2013-01-16 14:59:23)

Re: AHK: изменения типа запуска сервиса через WMI

Функция называется GetModuleExeName потому что базово была одна функция, а содержимое изменил. Ибо все содержимое в тестовом скрипте с кучей всего всего всего

Огромное спасибо за помощь вот такой вариант заработал:

ServName:="TeamViewer 7"
msgbox % SetStopServiceMod(ServName)

SetStopServiceMod(sname) {
for service in ComObjGet("winmgmts:").ExecQuery("select * from win32_service WHERE DisplayName='" . sname . "'")
errorreturncode:=service.Change(ComObjMissing(), ComObjMissing(), ComObjMissing(), ComObjMissing(),"Disabled")
        
return errorreturncode

}

P.S. Здравый смысл include

4 (изменено: creature.ws, 2013-01-16 14:57:39)

Re: AHK: изменения типа запуска сервиса через WMI

А чем вас не устраивает метод ChangeStartMode использовавшийся в примере сообщения #2?
Интересуюсь в образовательных целях.

5 (изменено: chippp, 2013-01-16 15:11:40)

Re: AHK: изменения типа запуска сервиса через WMI

Всем устраивает Просто дело привычки Ваш вариант тоже сохранил , вдруг пригодится
Да и метод Change позволяет внести больше изменений при незначительном изменении кода функции. Хотя в данном случае это не важно.

6

Re: AHK: изменения типа запуска сервиса через WMI

Тогда уж

SetServiceStartMode(serviceDisplayName, startMode) {
    WMI := ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" . A_ComputerName . "\root\cimv2")
    ServiceList := WMI.ExecQuery("SELECT * FROM Win32_Service WHERE DisplayName='" . serviceDisplayName . "'")
    None := ComObjMissing()

    for Service in ServiceList
        return Service.Change(None, None, None, None, startMode)
}

7

Re: AHK: изменения типа запуска сервиса через WMI

Идеальный вариант. Спасибо

8

Re: AHK: изменения типа запуска сервиса через WMI

Иногда антивирус блокирует скомпилированный файл и программа крашится с сообщением об ошибке в строке ComObjGet что-то вроде "сервис недоступен". Можно поставить какую-то проверку для таких случаев, чтобы вместо краха программы выдавалось стандартное сообщение?

9 (изменено: Malcev, 2015-11-05 17:59:27)

Re: AHK: изменения типа запуска сервиса через WMI

Можно вписать:

ComObjError(false)

А ошибку отлавливать с помощью A_LastError.