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