none
Бэкап в сетевую шару с паролем powershell RRS feed

  • Вопрос

  • Добрый день!

    Есть вот такой скрипт для бэкапа systemstate:

        # подключаем оснастку Server Backup и узнаем hostname тачки
        $name = hostname
        Add-PSSnapin Windows.Serverbackup
        # создаём задание бэкапа
        $profiles = New-WBPolicy
        # создаём и добавляем в задание бэкапа состояние системы
        Add-WBSystemState $profiles
        # указываем сетевую шару, куда будет копироваться архив
        $target = New-WBBackupTarget -NetworkPath \\192.168.1.1\soft\backup
        Add-WBBackupTarget -Policy $profiles -Target $target
        # выполняем бэкап
        Start-WBBackup -Policy $profiles
        # проверяем код возврата с результатом выполнения бэкапа
        if ((Get-WBSummary).LastBackupResultHR -eq 0) {
            # переименовываем архив в более понятное имя
            $newname = "SystemState_$(Get-Date -f dd.MM.yyyy)"
            Ren \\192.168.1.1\soft\backup\WindowsImageBackup\$name -NewName $newname
            # копируем архив в другую папку
            Move-Item -Path \\192.168.1.1\soft\backup\WindowsImageBackup\$newname -Destination \\192.168.1.1\soft\backup\$name\ -PassThru    
            # удаляем все архивы из сетевой папки, которые старше 7 дней
            dir \\192.168.1.1\soft\backup\$name\ | ?{$_.lastwritetime -lt (Get-Date).AddDays(-7)} | del -Force
        } else {
            # ругаемся, что бэкап не был завершён успешно
        }

    Вопрос: бэкап льется в сетевую папку с паролем, как можно в скрипте задать логин/пароль для доступа?

    Нашел Get-Credential, но непонятно как там указывать пасс.

    1 апреля 2011 г. 9:54

Ответы

  • >как можно в скрипте задать логин/пароль для доступа?

    например, так:

    $username = 'mydomain\myusername'
    $password = 'mypassword'
    $Credential= New-Object System.Management.Automation.PSCredential -ArgumentList $username,(ConvertTo-SecureString -String $password -AsPlainText -Force)


    my blog: http://shserg.ru/

    • Помечено в качестве ответа KazunEditor 1 апреля 2011 г. 11:31
    1 апреля 2011 г. 10:48
  • >В этом случае все равно придется вводить имя пользователя и пароль руками. Я имел ввиду несколько другую задачу

    Да, придется, но это нужно будет сделать только один раз, чтобы сформировать файл, содержащий зашифрованный пароль.

    Ваш скрипт, просто будет считывать информацию из этого файла дешифровывать ее и работать, как обычно.

    ЗЫ Стойкость шифрования, конечно, под вопросом, но, ЕМНИП, вы по крайней мере может влиять на ключ шифрования.


    my blog: http://shserg.ru/
    • Предложено в качестве ответа Andy Mishechkin 18 апреля 2011 г. 10:36
    • Помечено в качестве ответа KazunEditor 19 апреля 2011 г. 11:47
    18 апреля 2011 г. 8:34
  • get-help Start-Process 
    • Предложено в качестве ответа Andy Mishechkin 19 апреля 2011 г. 10:25
    • Помечено в качестве ответа KazunEditor 19 апреля 2011 г. 12:13
    18 апреля 2011 г. 13:40
    Отвечающий

Все ответы

  • >как можно в скрипте задать логин/пароль для доступа?

    например, так:

    $username = 'mydomain\myusername'
    $password = 'mypassword'
    $Credential= New-Object System.Management.Automation.PSCredential -ArgumentList $username,(ConvertTo-SecureString -String $password -AsPlainText -Force)


    my blog: http://shserg.ru/

    • Помечено в качестве ответа KazunEditor 1 апреля 2011 г. 11:31
    1 апреля 2011 г. 10:48
  • >как можно в скрипте задать логин/пароль для доступа?

    например, так:

    $username = 'mydomain\myusername'
    $password = 'mypassword'
    $Credential= New-Object System.Management.Automation.PSCredential -ArgumentList $username,(ConvertTo-SecureString -String $password -AsPlainText -Force)


    my blog: http://shserg.ru/

    Спасибо, помогло!
    1 апреля 2011 г. 11:52
  • $username = 'mydomain\myusername'
    $password = 'mypassword'
    $Credential= New-Object System.Management.Automation.PSCredential -ArgumentList $username,(ConvertTo-SecureString -String $password -AsPlainText -Force)

    А шифровать его можно ?
    А то пароль в скрипте открытым текстом ....
    Andy Mishechkin
    2 апреля 2011 г. 5:06
  • >А шифровать его можно ?

    Можно, конечно.

    Например так:


    Сначала получим реквизиты доступа от польхователя и сохраним зашифрованный пароль в файле
    $credential=Get-Credential
    $credential.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt

    В скрипте считываем зашифрованную строку из файла и добавляем его к объекту $Credential
    $password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
    $credential = New-Object System.Management.Automation.PSCredential "mydomain\myusername",$password

     


    my blog: http://shserg.ru/
    2 апреля 2011 г. 6:37
  • Например так:

    Сначала получим реквизиты доступа от польхователя и сохраним зашифрованный пароль в файле
    $credential=Get-Credential

    ....

    В этом случае все равно придется вводить имя пользователя и пароль руками. Я имел ввиду несколько другую задачу:

    пользователю необходимо запускать определенный скрипт, где находится имя пользователя (не того что запускает скрипт) и пароль, но пароль не должен быть в этом скрипте в виде открытого текста, и пользователь не должен знать этот пароль.

    Для шифрования WSH-скриптов есть утилита Scrupt Encoder, для PS-скриптов я ничего подобного не нашел.


    Andy Mishechkin
    18 апреля 2011 г. 6:11
  • Например так:

    Сначала получим реквизиты доступа от польхователя и сохраним зашифрованный пароль в файле
    $credential=Get-Credential

    ....

    В этом случае все равно придется вводить имя пользователя и пароль руками. Я имел ввиду несколько другую задачу:

    пользователю необходимо запускать определенный скрипт, где находится имя пользователя (не того что запускает скрипт) и пароль, но пароль не должен быть в этом скрипте в виде открытого текста, и пользователь не должен знать этот пароль.

    Для шифрования WSH-скриптов есть утилита Scrupt Encoder, для PS-скриптов я ничего подобного не нашел.


    Andy Mishechkin

    Пароль никогда не должен находится где-то в программе,нет никаких защит,чтоб его не вытащить.

    Ps1 можно конвертировать в exe ,тем самым получить результат типа Script Encoder . Более подробно в блоге Keith Hill - http://rkeithhill.wordpress.com/2010/09/21/make-ps1exewrapper/

    18 апреля 2011 г. 6:17
    Отвечающий
  • >В этом случае все равно придется вводить имя пользователя и пароль руками. Я имел ввиду несколько другую задачу

    Да, придется, но это нужно будет сделать только один раз, чтобы сформировать файл, содержащий зашифрованный пароль.

    Ваш скрипт, просто будет считывать информацию из этого файла дешифровывать ее и работать, как обычно.

    ЗЫ Стойкость шифрования, конечно, под вопросом, но, ЕМНИП, вы по крайней мере может влиять на ключ шифрования.


    my blog: http://shserg.ru/
    • Предложено в качестве ответа Andy Mishechkin 18 апреля 2011 г. 10:36
    • Помечено в качестве ответа KazunEditor 19 апреля 2011 г. 11:47
    18 апреля 2011 г. 8:34
  • Блин..., что-то везде грабли.
    Сделал по всем рекомендациям вот такие скрипты:

    $HomeDir = Get-Variable -Name HOME -ValueOnly
    $passwd = $HomeDir + "\passwd"
    $credential = Get-Credential
    $credential.Password | ConvertFrom-SecureString | Set-Content $passwd
    
    $HomeDir = Get-Variable -Name HOME -ValueOnly
    $passwd = $HomeDir + "\passwd"
    $password = Get-Content $passwd | ConvertTo-SecureString 
    $UsrCred = New-Object System.Management.Automation.PSCredential "Domain\user",$password
    Invoke-Command -ScriptBlock {Invoke-Expression -Command notepad.exe} -Credential $UsrCred
    

    Второй скрипт спотыкается на последней строке вот с такой формулировкой:

    Invoke-Command : Не удается разрешить набор параметров с использованием указанных именованных параметров.
    строка:7 знак:15
    + Invoke-Command <<<< -ScriptBlock {Invoke-Expression -Command notepad.exe} -Credential $UsrCred
      + CategoryInfo     : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
      + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.InvokeCommandCommand
    

    Если вместо $UsrCred передается имя пользователя и выскакивает форма ввода пароля - такая же ошибка.
    Если из Invoke-Command убрать -Credential - все отрабатывает без ошибок

    В чем проблема?


    Andy Mishechkin
    18 апреля 2011 г. 12:06
  • Небольшая поправка (при отправлении почему то накрылась граница между блоками кода разных скриптов)

    скрипт1:

    $HomeDir = Get-Variable -Name HOME -ValueOnly
    $passwd = $HomeDir + "\passwd"
    $credential = Get-Credential
    $credential.Password | ConvertFrom-SecureString | Set-Content $passwd
    
    скрипт2:
    $HomeDir = Get-Variable -Name HOME -ValueOnly
    $passwd = $HomeDir + "\passwd"
    $password = Get-Content $passwd | ConvertTo-SecureString 
    $UsrCred = New-Object System.Management.Automation.PSCredential "Domain\user",$password
    Invoke-Command -ScriptBlock {Invoke-Expression -Command notepad.exe} -Credential $UsrCred
    

    Andy Mishechkin
    18 апреля 2011 г. 12:08
  • >Invoke-Command -ScriptBlock {Invoke-Expression -Command notepad.exe} -Credential $UsrCred

    Какая-то странная конструкция: Зачем-то внутри скритблока используется invoke-expression + альтернативные credentials, но обращения к удаленному компьютеру не видно. Вы что хотели сделать этой строчкой?


    my blog: http://shserg.ru/
    18 апреля 2011 г. 12:24
  • >Invoke-Command -ScriptBlock {Invoke-Expression -Command notepad.exe} -Credential $UsrCred

    Какая-то странная конструкция: Зачем-то внутри скритблока используется invoke-expression + альтернативные credentials, но обращения к удаленному компьютеру не видно. Вы что хотели сделать этой строчкой

    нужно выполнить exe-шник с альтернативными credentials.

    invoke-command судя по документации не может запускать exe-шники

    у invoke-expression нет ключа -Credential 


    Andy Mishechkin
    18 апреля 2011 г. 13:28
  • get-help Start-Process 
    • Предложено в качестве ответа Andy Mishechkin 19 апреля 2011 г. 10:25
    • Помечено в качестве ответа KazunEditor 19 апреля 2011 г. 12:13
    18 апреля 2011 г. 13:40
    Отвечающий
  • get-help Start-Process 


    Спасибо, Kazun

    Кстати, заметил интересную вещь - если файл содержащий пароль сгенерирован под другим пользователем - второй скрипт не может оттуда выдернуть пароль (все необходимые права на файл имеются). Работает только если генерировать passwd под тем же пользователем, который будет потом запускать exe-шник

     


    Andy Mishechkin
    19 апреля 2011 г. 10:28