Войти

Показать полную графическую версию : powershell запуск скрипта на удаленном компьютере с авторизацией на сетевом ресурсе


densan
15-02-2018, 10:27
Здравствуйте.
Знакомлюсь с Powershell в режиме получения новых знаний при решении конкретных задач.
Есть задача установить на большом количестве компьютеров заказную установку MS Office 2010.
Скрипт для заказной установки есть и работает.
На части ПК дистрибутив MS Office 2010 присутствует в каталоге c:\distr. Проверка дистрибутива и запуск установки реализовано.
Не могу реализовать запуск установки из сетевой папки, нужно авторизоваться на удаленном сервере.

Стартующий скрипт:

$currentFolder=$MyInvocation.MyCommand.Path | Split-Path -Parent
$currentFolder=$currentFolder+"\"
$fileIN = $currentFolder+"pc.txt"
$fileOffLine= $currentFolder+"offline.txt"
$report= $currentFolder+"report.txt"
$fileFolder=$currentFolder+"files\"
$scriptFile=$currentFolder+"local.ps1"

$hostnames=get-content $fileIn

ForEach ($hostname in $hostnames)
{
if ( Test-Connection $hostname -Count 2 -Quiet:$true )
{
Invoke-Command -FilePath $scriptFile -ComputerName $hostname
} ### ONLINE

else
{
$hostname+" offline"
$hostname | Out-File $fileOffLine -Append
} ### OFFLINE
}

скрипт который выполняется на удаленных ПК

$localsetupfile="c:\distr\MS_Office_2010_Prof_Plus_SP1_64Bit_Russian_CORE_MLF_X17-77007\setup.exe"

function check_mso_version ()
#проверяем наличие установленного MS Office 2010
#т.к. через gwmi долго, иcпользуем такой способ
#$be=New-Object -ComObject Excel.Application
{
try
{
$be=((New-Object -ComObject Excel.Application).version).Substring(0,2)

}
catch
{
$be=""
}
Return $be
}

function check_distr ($file)
{
$isfile= Test-Path $file
if($isfile -eq "True")
{
# $report=$env:COMPUTERNAME+" дистрибутив есть"
# Write-host $report
}
else
{
# Write-host "Дистрибутив не найден"
}
Return $isfile
}

function install_excel ()
{

}

$version=check_mso_version

if (!$version)
{
# Write-Host "Excel не установлен"
if (check_distr($localsetupfile))
{
Write-Host "$env:COMPUTERNAME. Excel не установлен, дистрибутив найден"
cmd /c "c:\distr\MS_Office_2010_Prof_Plus_SP1_64Bit_Russian_CORE_MLF_X17-77007\files\only_excel.cmd"
}
else
{
Write-Host "$env:COMPUTERNAME. Excel не установлен, дистрибутив не найден"
# запуск установки из сетевой папки с авторизацией
}
}
else
{
Write-Host "$env:COMPUTERNAME. Excel установлен"
}

Подскажите, как можно реализовать авторизацию на удаленном сервере?

densan
15-02-2018, 10:46
Желательно не сохраняя в теле скрипта в явном виде пароль.

Kazun
15-02-2018, 10:59
Задача нетривиальная, самое простое решение:
1) Использовать пароль для подключения в скрипте для шары
2) Скопировать дитрибутив на компьютер через $hostname\C$\distr
3) Разрешить учетной записи компьютеров доступ к шаре

Более сложный варианты - https://blogs.technet.microsoft.com/ashleymcglone/2016/08/30/powershell-remoting-kerberos-double-hop-solved-securely/

densan
15-02-2018, 13:37
Вроде решил, но все равно скрипт далек от идеала


$currentFolder=$MyInvocation.MyCommand.Path | Split-Path -Parent
$currentFolder=$currentFolder+"\"
$fileIN = $currentFolder+"pc.txt"
$fileOffLine= $currentFolder+"offline.txt"
$report= $currentFolder+"report.txt"
$fileFolder=$currentFolder+"excel\"
$scriptFile=$currentFolder+"local.ps1"
$net_setup_folder="\\domain.local\bla-bla-bla\MS_Office_2010_Prof_Plus_SP1_64Bit_Russian_CORE_MLF_X17-77007"
$hostnames=get-content $fileIn

ForEach ($hostname in $hostnames)
{
if ( Test-Connection $hostname -Count 2 -Quiet:$true )
{
Copy-Item -Path $fileFolder -Destination \\$hostname\C$\Temp -Force -Recurse
$session = New-PSSession -ComputerName $hostname -Name $hostname
Invoke-Command -Session $session -ScriptBlock {New-PSDrive -name "U" -PSProvider "FileSystem" -Root $net_setup_folder -Credential domain\username}
Invoke-Command -FilePath $scriptFile -Session $session
Invoke-Command -Session $session -ScriptBlock {Remove-PSDrive -name "U"}
Remove-PSSession $session
Remove-Item -Path \\$hostname\C$\Temp\excel -Force -Recurse

} ### ONLINE

else
{
$hostname+" offline"
$hostname | Out-File $fileOffLine -Append
} ### OFFLINE
}
для каждого ПК приходится вводить пароль пользователя для авторизации на сетевом ресурсе.
почему-то не проходит конструкция с однократным вводом пароля
$credential = Get-Credential domain\username
....
Invoke-Command -Session $session -ScriptBlock {New-PSDrive -name "U" -PSProvider "FileSystem" -Root $net_setup_folder -Credential $credential}
в этом случае авторизация не проходит

Kazun
15-02-2018, 14:07
Для разового ввода пароля.Перед Foreach добавить:
$Credential = Get-Credential domain\username

И изменить:
Invoke-Command -Session $session -ScriptBlock {
param($user,$pass,$root)
$pass = ConvertTo-SecureString $pass -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($user,$pass)
New-PSDrive -name "U" -PSProvider "FileSystem" -Root $root -Credential $credential
} -ArgumentList $Credential.UserName,$Credential.GetNetworkCredential().Password,$net_setup_folder




© OSzone.net 2001-2012