Меня попросили заменить коллегу и написать сценарий 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)
}
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.
изменить: скобка перенесена
изменить 2: (OP, возможно, вас это не волнует, это больше для следующего вопроса Тони Рота.) Класс System.Security.SecureString имеет преимущества по сравнению с обычным System.Strings, но они относятся к защите данных и уменьшению поверхности атаки пока он находится в памяти (например, дамп памяти процесса не раскрыл бы ваши SecureString.) Но запись данных, которые были в SecureString, на диск, на мой взгляд, является хакерским приемом, а не тем способом, которым на самом деле должны были использоваться SecureStrings.
SecureStrings использует симметричный ключ (который также не хранится в памяти этих процессов) для шифрования и дешифрования данных. Я считаю, что ключ получается путем вызова advapi32.dll с использованием печально известного SystemFunction041. Это подразумевает, что задействован загрузочный ключ системы. Если ключ, используемый для SecureStrings, был просто загрузочным ключом или производным от загрузочного ключа, то это означает, что SecureString может быть расшифрован кем угодно на этой машине с достаточными разрешениями. Но мне интересно, является ли ключ SecureString загрузочным ключом системы в сочетании с хешем пароля пользователя? Опять же, мы могли бы довольно легко это выяснить, если это так. (Дополнительную информацию см. В разделе Управление ключами DPAPI.)
Если вы перенесете свой текстовый файл на другую машину, даже на другую машину, на которую вы вошли с тем же именем пользователя и паролем, вы обнаружите, что ваш текстовый файл теперь бесполезен. Вы должны создавать новый для каждой новой машины. Я думаю, что это подтверждает мою гипотезу о задействовании загрузочного ключа, поскольку он уникален для каждой системы. Но пользователь A и пользователь B на одном компьютере не могут расшифровать текстовые файлы друг друга, поэтому он должен использовать некоторые пользовательские данные в дополнение к машинным данным, чтобы придумать ключ.