none
Invoke-Command -ComputerName SERVER1 -FilePath \\SERVER2\scripts\zabbixt.ps1 RRS feed

  • Вопрос

  • Доменная сеть.
    Выполняю на 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

    3 ноября 2017 г. 12:57
    Модератор
  • $Path = "\\$($i.name)\C$\zabbix\"

    3 ноября 2017 г. 13:09
    Отвечающий