В настоящее время я пишу службу для Windows и часто ее настраиваю и обновляю на своем тестовом компьютере. Я хотел бы написать скрипт, который автоматически останавливает службу, обновляет exe-файл и перезапускает службу. Однако именно с этой частью остановки и запуска у меня проблемы.
Компьютер, к которому я подключаюсь, не находится в домене, и мы не разделяем имя пользователя и пароль. Я думаю, что лучше всего сделать это, sc.exe \\testsvr stop "myService"
однако, поскольку у меня нет домена или общих имен пользователей и паролей, это дает мне сообщение «Доступ запрещен».
Я могу очень легко просто добавить пользователя, но мне это было нужно в качестве обучающего опыта на случай, если я не смогу изменить пользователей.
решение1
Я бы посмотрел наPsServiceиз Sysinternals компании Microsoft (это часть превосходного набора инструментов, написанного Марком Руссиновичем).
Прямо с сайта:
Usage: psservice [\\computer [-u username] [-p password]] <command> <options>
Для <command>
, вы можете использовать start
, stop
, или restart
как наиболее распространенные варианты. Что хорошо в этом скрипте, так это то, что он не зависит от того, являются ли две машины членами одного домена или имеют ли они какие-либо другие доверительные отношения.
решение2
Для полноты картины, если вы хотите сделать это только с помощью стандартных инструментов Windows, вы можете сначала установить IPC-соединение с удаленной машиной (чтобы установить токен безопасности на этой машине), а затем использовать команду «SC»:
net use \\remote\IPC$ /user:local-username-on-remote-machine passowrd
sc \\remote stop service-name
net use \\remote\IPC$ /delete
Это позволит вам управлять службами на удаленной машине, независимо от комбинации членства в рабочей группе/домене обеих машин.
решение3
Лично я никогда не пробовал это в конфигурации, отличной от домена, но, возможно, стоит запустить SC.exe с помощью «RunAs» и использовать учетные данные целевого компьютера?
Runas /user:TargetComputerName\TargetAccountName "sc.exe \\testsvr stop ""myService"""
решение4
В среде DOMAIN вы можете использовать команды NET USE, предполагая, что вашему вошедшему в систему пользователю, который запускает скрипт, предоставлены соответствующие права пользователя. PowerShell, вероятно, является самым мощным вариантом, но если вы используете старые операционные системы Microsoft, у вас могут возникнуть некоторые проблемы с запуском некоторых команд PowerShell. Если все работает на Windows 2008 или новее, я бы определенно выбрал PowerShell.
Если это не вариант, я имел большой успех с пакетом PSTools. Если вы ВЫБИРАЕТЕ этот вариант, как Эван упомянул ранее, вам, вероятно, следует ознакомиться с утилитой pskill в том же пакете. Некоторые службы не умирают изящно, когда вы возитесь с ними удаленно, и эта маленькая утилита ОТЛИЧНО подходит для их уничтожения.
Из любопытства, на каком языке скриптов вы это кодируете? VBScript? BATch? Perl?