Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   powershell запуск скрипта на удаленном компьютере с авторизацией на сетевом ресурсе (http://forum.oszone.net/showthread.php?t=333192)

densan 15-02-2018 10:27 2798074

powershell запуск скрипта на удаленном компьютере с авторизацией на сетевом ресурсе
 
Здравствуйте.
Знакомлюсь с 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 2798076

Желательно не сохраняя в теле скрипта в явном виде пароль.

Kazun 15-02-2018 10:59 2798080

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

Более сложный варианты - https://blogs.technet.microsoft.com/...lved-securely/

densan 15-02-2018 13:37 2798112

Вроде решил, но все равно скрипт далек от идеала

Код:

$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 2798119

Для разового ввода пароля.Перед 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



Время: 17:22.

Время: 17:22.
© OSzone.net 2001-