Inicialmente postado no Stack Overflow e direcionado aqui. Eu sou novo em programação e estou tentando escrever um script PowerShell para gerenciar atualizações de software.
Eu estou em um ambiente de domínio do Windows com mais de 50 escritórios remotos. Cada escritório tem 4 computadores. Um computador, "Computador A", tem uma caixa de depósito instalada que usamos para backups e agora atualizações de software. Quero executar um script da minha máquina local que copie uma pasta (~ 1 GB) para os outros computadores nessa LAN e execute o arquivo setup.exe no diretório para atualizar o software nesses computadores.
Tanto quanto eu posso dizer, a fim de usar o cmdlet Enter-pssession & executar um item de cópia e iniciar o processo, eu tenho que:
- Na máquina remota, ative o winrm: enable-psremoting -force
- Na máquina remota, ative a autenticação CredSSP: enable-smancredssp -role server -force
- Na máquina local, ative a autenticação CredSSP: enable-SmanCredSSP -role
cliente -force
A partir daqui, posso entrar na sessão do Power shell e começar a cópia e instalar. Aqui está o código que estou executando:
#Allow my computer to send credentials to remote computers
Enable-WSManCredSSP -Role Client -DelegateComputer * -Force
$credential = Get-Credential -Credential domain\user
#Getting Content
$path = "C:\computernames.csv"
Import-Csv -path $path |
foreach-object {
$computername = $_.Name
if (Test-Connection -cn $_.Name -quiet) {
#copy the batch file that allows remote powershell access
$source = "c:\"
$destination = "\$computername\c$\install files\remoteaccess"
robocopy $source $destination
#open file to allow remote PS access
& psexec \$computername -a runas -u domain\user -p password -c -f -h "\$computername\c$\install files\remoteaccess\remoteaccess.bat"
#Initiates Power Shell session with remote computer
Enter-PSSession -cn $_.Name -Credential $credential -Authentication Credssp
#begin copy
#be sure to refine destination
copy-item -path $_.Source -Destination $_.Destination -force -verbose -recurse | out-file c:\copylog.txt
#begin silent install
#code here
#stop wsmancredssp accep
disable-wsmancredssp -role server
#close pssession
exit-pssession
} else {
"$computername is not online"
}
}
Disable-wsmancredssp -role client
O computernames.csv tem os cabeçalhos: Name, Source, Destination com diretórios UNC para cada computador da LAN com dropbox e onde copiar o arquivo.
O arquivo "remoteaccess.bat" contém as duas linhas de código a seguir:
powershell.exe enable-psremoting -force >>c:\remotelog.txt
powershell.exe Enable-WSManCredSSP -role Server -force >>c:\remotelog.txt
A janela do powershell congela depois de iniciar a sessão psexec com o computador remoto e envia o primeiro comando powershell para habilitar o remoting. Nenhum erro é gerado ou a entrada é solicitada. A saída deste comando é salva no arquivo de texto remotelog:
"O WinRM foi atualizado para receber solicitações.
Serviço WinRM iniciado.
O WinRM já está configurado para gerenciamento remoto nesta máquina. "
Parece que o comando powershell para ativar o wsmancredssp nunca é recebido. Quando executo o arquivo em lote no computador remoto a partir do software de acesso remoto, ambos os comandos são executados e registrados com êxito. Onde o meu comando psexec está dando errado ou como posso configurar esses computadores para permitir sessões remotas com um comando remoto sem usar o GPO?