How to restart the IOTLink service with administrator rights and bypass UAC
I found a working way to bypass UAC on Windows to run a batnik with elevated rights. I have Windows 11 and it works like you will, I do not know. I wrote above that I have a problem with user sensors and they become unavailable. Now the issue is resolved. Below I will describe the sequence of actions.
First, we create a text file and enter commands to turn off and start the IOTLink service
net stop IOTLink - stop the service
rem - waits for the service to be stopped, and then start the service
net start IOTLink - start the service
This is what the usual code for restarting the service looks like, but such a batnik will not start without elevated rights and you will need to run it with administrator rights and if UAC is enabled, you will need to confirm the launch.
@echo off
net stop IOTLink
rem
net start IOTLink
In order for the batnik to start with elevated rights, you just need to copy all this code into a text file and rename it, for example, to iotlink_reboot_service.bat. We try to run the batnik and if everything is done correctly, the batnik will start, but the UAC will ask you to confirm. That’s right, that’s how it should be. Now we need to bypass UAC, read below
@echo off
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
net stop IOTLink
rem
net start IOTLink
To run the iotlink_reboot_service batnik.bat bypassing UAC, we need to install the UAC Trust Shortcut program on Windows. Then, as soon as you install the UAC Trust Shortcut program, run the UAC Trust Shortcut and create a shortcut based on the iotlink_reboot_service.bat bat. I named the shortcut iotlink_reboot_service.lnk. If you look at the properties of the created shortcut, then the object will indicate
"C:\Program Files\ITknowledge24\ucmd.exe" -rC:\Scripts\iotlink_reboot_service.bat
and since IOTLink does not know how to launch a shortcut, we will create another batnik that will launch the iotlink_reboot_service.lnk shortcut, and that in turn will launch the iotlink_reboot_service.bat batnik.
Creating a batnik named launching_iotlink_reboot_service.bat and add the code to it
start explorer.exe c:\Scripts\iotlink_reboot_service.lnk
As a result, we should have 3 files
- iotlink_reboot_service.bat - restarting the IOTLink service with administrator rights
- iotlink_reboot_service.lnk - to bypass UAC
- launching_iotlink_reboot_service.bat - to launch the iotlink_reboot_service.lnk shortcut
Now in Home Assistant you can create a script to restart the IOTLink service
service: mqtt.publish
data:
topic: iotlink/workgroup/livingroom/commands/run
payload: >-
{ "command": "C:\\Scripts\\launching_iotlink_reboot_service.bat", "path": "C:\\Scripts",
"user": "", "visible": false, "fallback": false }
Next, we create automation that will monitor the sensor and run a script to restart IOTLink. For me, as a user sensor, it becomes unavailable, then a script is run that restarts the IOTLink service
alias: 'System: IOTLink. Monitoring. Reboot'
description: >-
We monitor IOTLink sensors. If the sensors are unavailable,
a script will be run that will restart the IOTLink
trigger:
- platform: state
entity_id:
- binary_sensor.livingroom_games
to: unknown
for:
hours: 0
minutes: 0
seconds: 0
- platform: time_pattern
minutes: /5
condition:
- condition: template
value_template: '{{ is_state("switch.computer", "on") }}'
- condition: template
value_template: '{{ is_state("binary_sensor.livingroom_games", "unknown") }}'
action:
- service: script.livingroom_computer_iotlink_restart
data: {}
mode: single
Текст на русском(Text in Russian)
Как перезапустить службу IOTLink с правами администратора и обойти UAC
Нашел рабочий способ обхода UAC на Windows для запуска батника с повышенными правами. У меня стоит Windows 11 и это работает, как будет у вас, я не знаю. Выше я писал, что у меня наблюдается проблема с пользовательскими сенсорами и они становятся недоступными. Теперь вопрос решен. Ниже опишу последовательность действии.
Сперва создаем текстовый файлик и вписываем команды на выключение и запуск службы IOTLink
net stop IOTLink - остановить службу
rem - ждет, когда будет выполнена остановка службы, а после запустит службу
net start IOTLink - запустить службу
Так выглядит обычный код для перезапуска службы, но такой батник не запустится без повышенных прав и потребуется запускать его с правами администратора и если включен UAC, то нужно будет подтвердить запуск.
@echo off
net stop IOTLink
rem
net start IOTLink
Чтобы батник запустился с повышенными правами, нужно просто скопировать весь этот код в текстовый файлик и переименовать например в iotlink_reboot_service.bat. Пробуем запустить батник и если все сделано правильно, то батник запустится, но UAC попросит подтвердить. Это правильно, так и должно быть. Теперь нам нужно обойти UAC, читаем ниже
@echo off
:: BatchGotAdmin
:-------------------------------------
REM --> Check for permissions
IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
)
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
net stop IOTLink
rem
net start IOTLink
Чтобы запустить батник iotlink_reboot_service.bat в обход UAC нам нужно установить на Windows программу UAC Trust Shortcut. Потом, как установите программу UAC Trust Shortcut, запустите UAC Trust Shortcut и создайте ярлык на основе батника iotlink_reboot_service.bat. Я назвал ярлык iotlink_reboot_service.lnk. Если посмотреть свойство созданного ярлыка, то в объекте будет указано
"C:\Program Files\ITknowledge24\ucmd.exe" -rC:\Scripts\iotlink_reboot_service.bat
а так как IOTLink не умеет запускать ярлык, то мы создадим еще один батник, который запустит ярлык iotlink_reboot_service.lnk, а тот в свою очередь запустит батник iotlink_reboot_service.bat
Создаем батник с именем launching_iotlink_reboot_service.bat и добавляем в него код
start explorer.exe c:\Scripts\iotlink_reboot_service.lnk
В итоге у нас должно получиться 3 файлика
- iotlink_reboot_service.bat - перезапуск службы IOTLink с правами администратора
- iotlink_reboot_service.lnk - для обхода UAC
- launching_iotlink_reboot_service.bat - для запуска ярлыка iotlink_reboot_service.lnk
Теперь в Home Assistant можете создать скрипт для перезапуска службы IOTLink
service: mqtt.publish
data:
topic: iotlink/workgroup/livingroom/commands/run
payload: >-
{ "command": "C:\\Scripts\\launching_iotlink_reboot_service.bat", "path": "C:\\Scripts",
"user": "", "visible": false, "fallback": false }
Далее, создаем автоматизацию, которая будет следить за сенсором и запускать скрипт на перезапуск IOTLink. У меня как пользовательский сенсор становится недоступным, то запускается скрипт, который перезапускает службу IOTLink
alias: 'Система: IOTLink. Мониторинг. Перезагрузка'
description: >-
Мониторим сенсоры IOTLink. Если сенсоры будут недоступны, то будет запущен
скрипт, который перезагрузит IOTLink
trigger:
- platform: state
entity_id:
- binary_sensor.livingroom_games
to: unknown
for:
hours: 0
minutes: 0
seconds: 0
- platform: time_pattern
minutes: /5
condition:
- condition: template
value_template: '{{ is_state("switch.computer", "on") }}'
- condition: template
value_template: '{{ is_state("binary_sensor.livingroom_games", "unknown") }}'
action:
- service: script.livingroom_computer_iotlink_restart
data: {}
mode: single