Копирование и перемещение файлов с одного сервера на другой на Windows Server
Меня попросили подключиться к коллеге, заполнить его и написать скрипт Windows, который будет работать на сервере № 2 и выполнить:
1) Подключитесь и авторизуйтесь на удаленном сервере № 1 с сервера № 2
2) Скопируйте только файлы с сервера #1, которые соответствуют файлам, названным так:
Monthly_Review[1001-8754].journal
3) Переместите эти файлы в путь D:/Path/NotIntegrated на сервере № 2
Я не являюсь администратором сервера Windows и работаю с Linux годами, поэтому любые предложения / помощь помогут мне в этом.
Спасибо
ОБНОВЛЕНИЕ Похоже, PowerShell является правильным инструментом для этой задачи. (Спасибо @Ryan Ries) Я тестирую локально на Windows XP, которая, кажется, работает только с PowerShell 1, поэтому приведенный ниже скрипт PowerShell 3 не будет работать на PowerShell 1. Как я могу изменить это для запуска на PowerShell 1?
$source = "C:\Users\Me\"
$destination ="C:\Users\Me\Processed\"
if(-not(Test-Path $destination)){mkdir $destination | out-null}
foreach($i in Get-Children -Path $source -Recurse)
{
if(($i.Name -notmatch "Monthly_Review[\d\d\d\d-\d\d\d\d].journal") -and (-not $i.PsIsContainer))
{
continue;
}
Copy-Item -Path $i.FullName -Destination $i.FullName.Replace($source,$destination).Trim($i.Name)
}
1 ответ
Powershell. Вы не упомянули, находятся ли серверы в домене AD или нет. Аутентификация в этой ситуации была бы беспроблемной, но я предполагаю, что они не присоединены к домену, поэтому вы должны предоставить учетные данные в своем скрипте, если вы не хотите вводить кредиты вручную.
Сначала сохраните пароль к файлу, как это:
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File password.txt
Пароль будет скрыт, но не зашифрован. Но это все же немного лучше, чем простой текст. Затем в своем скрипте прочитайте пароль из этого файла и используйте его для аутентификации на другом сервере.
$PW = Get-Content password.txt | ConvertTo-Securestring
$Creds = New-Object -Typename System.Management.Automation.PSCredential -Argumentlist "SERVER02\Administrator",$PW
ForEach ($_ In $(Get-ChildItem C:\ -Recurse -File | Where-Object { $_.Name -match "myfile_\d\d\d\d-\d\d\d\d.journal" }))
{
Copy-Item $_ -Destination \\SERVER02\D\Path\NotIntegrated -Credential $Creds
}
Этот пример был написан на PS 3. У вас может не быть PS 3, поэтому вам, возможно, придется немного изменить сценарий. Например, я думаю, что переключатель -File в командлете Get-ChildItem является новым в PS 3.
редактировать: перенесены скобки
edit 2: (OP, вы можете не заботиться об этом, это больше касается вопроса о задании Тони Рота.) Существуют преимущества класса System.Security.SecureString по сравнению с обычными System.Strings, но они имеют отношение к защите данных и уменьшению поверхности атаки. пока он находится в памяти (например, дамп памяти процесса не будет представлять ваши SecureStrings.) Но запись данных, которые были в SecureString, на диск - это, на мой взгляд, взлом, а не то, как на самом деле предполагалось использовать SecureStrings.
SecureStrings используют симметричный ключ (который также не хранится в памяти этих процессов) для шифрования и дешифрования данных. Я полагаю, что ключ получен вызовом advapi32.dll, используя печально известную SystemFunction041. Это подразумевает, что системный загрузочный ключ задействован. Если ключ, используемый для SecureStrings, был просто загрузочным ключом или производным от загрузочного ключа, то это означает, что SecureString может быть дешифрован любым пользователем на этом компьютере с достаточными разрешениями. Но мне интересно, является ли ключ SecureString системным загрузочным ключом в сочетании с хэшем пароля пользователя? Опять же, мы могли бы понять это довольно легко, если это так. (Посмотрите управление ключами DPAPI для дальнейшего исследования.)
Если вы перенесете свой текстовый файл на другой компьютер, даже на другой компьютер, на который вы вошли с тем же именем пользователя и паролем, вы обнаружите, что ваш текстовый файл теперь бесполезен. Вы должны создать новый для каждой новой машины. Я думаю, что это подтверждает мою гипотезу об участии загрузочного ключа, потому что он уникален в каждой системе. Но пользователь A и пользователь B на одном и том же компьютере не могут расшифровать текстовые файлы друг друга, поэтому он должен использовать некоторые специфичные для пользователя данные в дополнение к специфическим для машины данным, чтобы получить ключ.