Часть первая: особенности командной строки PowerShell
Используйте &
для вызова внешнего исполняемого файла. Синтаксис: & "[path] command" [arguments]
.
Также обратите внимание, что msdeploy поддерживает альтернативный способ указания аргументов при вызове из PowerShell:
С небольшим изменением обычного синтаксиса команды веб-развертывания можно запускать из командной строки Windows PowerShell. Для этого измените символ двоеточия (:) после глагола, исходного и целевого аргументов команды Web Deploy на знак равенства (=). В следующем примере сравните команду Web Deploy с ее версией PowerShell.
Команда веб-развертывания:
command: msdeploy -verb:sync -source:metakey=/lm/w3svc/1 -dest:metakey=/lm/w3svc/2 -verbose
Команда PowerShell:
.\msdeploy.exe -verb=sync -source=metakey=/lm/w3svc/1 -dest=metakey=/lm/w3svc/2 -verbose
Обратите внимание, что аргументы завернуты в массив: это подсказывает PowerShell, как правильно передать их целевому приложению.
Пример:
Invoke-Command -ComputerName RemoteServer1 -ScriptBlock {&"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" @('-verb=sync', '-source=package="\\Server\Share\Package.zip"', '-dest=auto,computerName=Server1')}
Из ваших комментариев я вижу, что теперь PowerShell успешно запускает msdeploy
на удаленном сервере, но msdeploy
не может получить доступ к удаленному общему ресурсу:
Пока команда выполняется, теперь msdeploy говорит:
«Дополнительная информация: объект типа «пакет» и путь «\Server\Share\Package.zip» не может быть создан. Дополнительные сведения см. по адресу: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_EXCEPTION_WHILE_CREATING_OBJECT.
Ошибка: Zip-пакет «\Server\Share\Package.zip» не может быть загружен. Ошибка: доступ к пути «\Server\Share\Package.zip» запрещен. Количество ошибок: 1".
Даже если у пользователя есть доступ к общему ресурсу (чтение/запись).
Это потому, что вы на самом деле пытаетесь установить сеанс удаленного взаимодействия с компьютера A (клиент) на компьютер B (сервер), а затем с компьютера B вы пытаетесь получить доступ к файлу в общем ресурсе на компьютере C (\\Server\Share\Package.zip
).
Invoke-Command
происходит сбой, поскольку удаленный сеанс пытается получить доступ к общему файловому ресурсу, используя учетные данные компьютера вместо учетных данных, используемых для вызова удаленного сеанса. Существует способ передать или делегировать учетные данные от клиента, чтобы мы могли аутентифицироваться в общей папке. Это то, что называется аутентификацией с несколькими переходами, и удаленное взаимодействие PowerShell позволяет использовать CredSSP.
Чтобы включить CredSSP, запустите эти команды из командной строки с повышенными привилегиями:
На вашем ПК: Enable-WSManCredSSP -Role Client -DelegateComputer
"TargetServer.FQ.DN"
Параметр DelegateComputer
используется для указания сервера или серверов, которые получают делегированные учетные данные от клиента. DelegateComputer
принимает подстановочные знаки (*.FQ.DN
). Вы также можете указать *
, чтобы указать все компьютеры в сети.
На целевом сервере: Enable-WSManCredSSP -Role Server
Теперь вы сможете запустить Invoke-Command
с CredSSP в качестве метода аутентификации и передать учетные данные:
Invoke-Command -ComputerName RemoteServer1 -Authentication Credssp -Credential Domain\Username -ScriptBlock {&"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" @('-verb=sync', '-source=package="\\Server\Share\Package.zip"', '-dest=auto,computerName=Server1')}
Часть третья: передача параметров с помощью Invoke-Command
Как мне настроить сервер. Если у меня есть параметр $Server
в качестве имени сервера, как мне вставить его вместо части -dest=auto,computerName=Server1
?
Чтобы передать аргументы в скриптовый блок, используйте параметр ArgumentList
:
$Servers = @('Server1', 'Server2', 'Server3')
$Command = {
Param($Srv)
&"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" @('-verb=sync', '-source=package="\\Server\Share\Package.zip"', "-dest=auto,computerName=$Srv")
}
$Servers |
ForEach-Object {
Invoke-Command -ComputerName RemoteServer1 -Authentication Credssp -Credential Domain\Username -ScriptBlock $Command -ArgumentList $_
}
Идем дальше:
Как бы я мог динамически добавлять дополнительные параметры в команду. Мне нужно добавить -skip:objectName=dirPath,absolutePath="<folder>"
к аргументам в строке &"C:\Program Files\..."
для каждой папки в массиве строк.
Если у вас есть один набор папок для исключения для всех серверов:
$Servers = @('Server1', 'Server2', 'Server3')
$SkipPaths = @('C:\folder\to\skip1', 'C:\folder\to\skip2', 'C:\folder\to\skip3')
$SkipCmd = $SkipPaths | ForEach-Object {"-skip=objectName=dirPath,absolutePath=$_"}
$Command = {
Param($Srv, $Skp)
&"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" $(@('-verb=sync', '-source=package="\\Server\Share\Package.zip"', "-dest=auto,computerName=$Srv") + $Skp)
}
$Servers |
ForEach-Object {
Invoke-Command -ComputerName RemoteServer1 -Authentication Credssp -Credential Domain\Username -ScriptBlock $Command -ArgumentList ($_, $SkipCmd)
}
Если у вас разный набор папок для каждого из серверов:
$Servers = @{
Server1 = @('C:\folder\to\skip_1', 'C:\folder\to\skip_2', 'C:\folder\to\skip_3')
Server2 = @('C:\folder\to\skip_A', 'C:\folder\to\skip_B', 'C:\folder\to\skip_C')
Server3 = @('C:\folder\to\skip_X', 'C:\folder\to\skip_Y', 'C:\folder\to\skip_Z')
}
$Command = {
Param($Srv, $Skp)
&"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" $(@('-verb=sync', '-source=package="\\Server\Share\Package.zip"', "-dest=auto,computerName=$Srv") + $Skp)
}
$Servers.GetEnumerator() |
ForEach-Object {
$SkipCmd = $_.Value | ForEach-Object {"-skip=objectName=dirPath,absolutePath=$_"}
Invoke-Command -ComputerName RemoteServer1 -Authentication Credssp -Credential Domain\Username -ScriptBlock $Command -ArgumentList ($_.Key, $SkipCmd)
}
person
beatcracker
schedule
17.02.2015
$sb = { svn log C:\src -l5 }; &$sb
- person campbell.rw   schedule 19.02.2015