Лучший отвечающий
Invoke-Command -ComputerName SERVER1 -FilePath \\SERVER2\scripts\zabbixt.ps1

Вопрос
-
Доменная сеть.
Выполняю на SERVER3 скрипт через Invoke-Command:mkdir c:\zabbix cd c:\zabbix\ xcopy /S "\\SERVER2\scripts\zabbix_agent\bin\win64\*" c:\zabbix\ $FQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain (Get-Content zabbix_agentd.win.conf) | ForEach-Object { $_ -replace "Hostname=Windows host", "Hostname=$FQDN" } | Set-Content zabbix_agentd.win.conf .\zabbix_agentd.exe --config zabbix_agentd.win.conf --install .\zabbix_agentd.exe --config zabbix_agentd.win.conf --start
Папка создаётся, а вот файлы не копируются:
PS C:\Windows\system32> Invoke-Command -ComputerName SERVER1 -FilePath \\SERVER2\scripts\zabbix.ps1 Directory: C:\ Mode LastWriteTime Length Name PSComputerName ---- ------------- ------ ---- -------------- d----- 30.10.2017 15:14 zabbix SERVER1 0 File(s) copied Invalid drive specification + CategoryInfo : NotSpecified: (Invalid drive specification:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError + PSComputerName : SERVER1 Cannot find path 'C:\zabbix\zabbix_agentd.win.conf' because it does not exist. + CategoryInfo : ObjectNotFound: (C:\zabbix\zabbix_agentd.win.conf:String) [Get-Content], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand + PSComputerName : SERVER1 The term '.\zabbix_agentd.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. + CategoryInfo : ObjectNotFound: (.\zabbix_agentd.exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException + PSComputerName : SERVER1 The term '.\zabbix_agentd.exe' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. + CategoryInfo : ObjectNotFound: (.\zabbix_agentd.exe:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException + PSComputerName : SERVER1
Если выполнить на самом SERVER2 этот скрипт напрямую из Powershell - всё работает:
PS C:\Windows\system32> \\SERVER2\scripts\zabbix.ps1 Directory: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 30.10.2017 15:17 zabbix \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_agentd.exe \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_agentd.win.conf \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_get.exe \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_sender.exe \\SERVER2\scripts\zabbix_agent\bin\win64\dev\zabbix_sender.dll \\SERVER2\scripts\zabbix_agent\bin\win64\dev\zabbix_sender.lib 6 File(s) copied zabbix_agentd.exe [2432]: ERROR: service [Zabbix Agent] already exists zabbix_agentd.exe [124]: service [Zabbix Agent] started successfully
Invalid drive specification:String - означает нет прав, но запускаю под одним и тем же пользователем, разница только в том, что при прямом запуске - работает, а при удалённом через Invoke-Command - не работает.30 октября 2017 г. 14:24Модератор
Ответы
-
Учетные данные не передаются на удаленный компьютер при Invoke-Command по умолчанию. Подключение идет к шаре от учетной записи компьютера, поэтому у него должны быть права.
1) Можно явно задать в блоке Invoke-Command подключение с логином и паролем пользователя, например net use /?
2) Можно скопировать до Invoke-Command данные на компьютер, если доступны шары:
copy \\remote\C$\Zabix
3) Можно настроить CredSSP - https://4sysops.com/archives/using-credssp-for-second-hop-powershell-remoting/
4) Можно настроить Kerberos constrained delegation - https://blogs.technet.microsoft.com/ashleymcglone/2017/04/12/powershell-remoting-and-kerberos-double-hop-old-problem-new-secure-solution/
5) Можно создать задачу в Task Scheduler
6) Если скажем шары закрыты, а есть только подключение PSRemoting, то создать сессию через New-PSSession, скопировать файлы в удаленную сессию с помощью Copy-Item -ToSession и выполнить остальные команды Invoke-Command -Session
Способов много, самый простой- скопировать до выполнения или передать учетные данные явно.
- Изменено KazunEditor 30 октября 2017 г. 14:40
- Помечено в качестве ответа AnahaymModerator 30 октября 2017 г. 15:21
30 октября 2017 г. 14:36Отвечающий
Все ответы
-
Учетные данные не передаются на удаленный компьютер при Invoke-Command по умолчанию. Подключение идет к шаре от учетной записи компьютера, поэтому у него должны быть права.
1) Можно явно задать в блоке Invoke-Command подключение с логином и паролем пользователя, например net use /?
2) Можно скопировать до Invoke-Command данные на компьютер, если доступны шары:
copy \\remote\C$\Zabix
3) Можно настроить CredSSP - https://4sysops.com/archives/using-credssp-for-second-hop-powershell-remoting/
4) Можно настроить Kerberos constrained delegation - https://blogs.technet.microsoft.com/ashleymcglone/2017/04/12/powershell-remoting-and-kerberos-double-hop-old-problem-new-secure-solution/
5) Можно создать задачу в Task Scheduler
6) Если скажем шары закрыты, а есть только подключение PSRemoting, то создать сессию через New-PSSession, скопировать файлы в удаленную сессию с помощью Copy-Item -ToSession и выполнить остальные команды Invoke-Command -Session
Способов много, самый простой- скопировать до выполнения или передать учетные данные явно.
- Изменено KazunEditor 30 октября 2017 г. 14:40
- Помечено в качестве ответа AnahaymModerator 30 октября 2017 г. 15:21
30 октября 2017 г. 14:36Отвечающий -
Подключение идет к шаре от учетной записи компьютера, поэтому у него должны быть права.
они есть. проверял с помощью PsExec.exe -i -s -d powershell
1) это не: Invoke-Command -ComputerName SERVER1 -Credential $Cred -FilePath \\SERVER2\scripts\zabbix.ps1. в любом случае так не сработало.
2) это сработало:
PS C:\Windows\system32> xcopy /S "\\SERVER2\scripts\zabbix_agent\bin\win64\*" \\SERVER1\\C$\zabbix\ \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_agentd.exe \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_agentd.win.conf \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_get.exe \\SERVER2\scripts\zabbix_agent\bin\win64\zabbix_sender.exe \\SERVER2\scripts\zabbix_agent\bin\win64\dev\zabbix_sender.dll \\SERVER2\scripts\zabbix_agent\bin\win64\dev\zabbix_sender.lib 6 File(s) copied
остальное не пробовал.
30 октября 2017 г. 15:21Модератор -
Подключение идет к шаре от учетной записи компьютера, поэтому у него должны быть права.
они есть. проверял с помощью PsExec.exe -i -s -d powershell
1) это не: Invoke-Command -ComputerName SERVER1 -Credential $Cred -FilePath \\SERVER2\scripts\zabbix.ps1. в любом случае так не сработало.
Имелось ввиду , явная передача параметров:
zabbix.ps1:
Param( $UserName, $Password ) mkdir c:\zabbix cd c:\zabbix\ $Credential = New-Object System.Management.Automation.PSCredential($UserName,(ConvertTo-SecureString $Password -AsPlainText -Force)) New-PSDrive -Name P -PSProvider FileSystem -Root "\\SERVER2\scripts\zabbix_agent\bin\win64" -Credential $Credential xcopy /S "P:\*" c:\zabbix\ Remove-PSDrive -Name P -Force -Confirm:$false
И вызов:
Invoke-Command -ComputerName SERVER1 -Credential $Cred -FilePath \\SERVER2\scripts\zabbix.ps1 -ArgumentList $Cred.UserName,$Cred.GetNetworkCredential().Password
30 октября 2017 г. 16:38Отвечающий -
а вот ещё вопрос возник. я беру членов группы AD и копирую каждому файлы, но почему-то имя серверов не подставляется в скрипт:
$Server = get-adgroupmember -Identity "zabbix agent" Foreach ($i in $Server) { xcopy /S "\\SERVER2\scripts\zabbix_agent\bin\win64\*" "\\$i.name\C$\zabbix\" }
xcopy : Invalid drive specification At \\SERVER2\scripts\zabbix.ps1:3 char:1 + xcopy /S "\\SERVER2\scripts\zabbix_agent\bin\win64\*" "\\$i.name ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (Invalid drive specification:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
хотя если вывести $i.name - то выдаст имя компьютера. Как правильно вставить переменную в путь?
делал ещё через промежуточную переменную, а там ещё хуже получилось:
$Server = get-adgroupmember -Identity "zabbix agent" Foreach ($i in $Server) {
$Path = "\\$i.name\C$\zabbix\" xcopy /S "\\SERVER2\scripts\zabbix_agent\bin\win64\*" $Path
$Path
$i.name }и вывод $Path & $i.name:
\\CN=DC1,OU=SERVERS,DC=Domain,DC=ROOT,DC=LOCAL.name\C$\zabbix\
DC1- Изменено AnahaymModerator 3 ноября 2017 г. 12:58
3 ноября 2017 г. 12:57Модератор -
$Path = "\\$($i.name)\C$\zabbix\"
3 ноября 2017 г. 13:09Отвечающий