在Windows Server上将文件从一台服务器复制到另一台服务器

我被要求跳入并填写一个同事,并写一个Windows脚本,将在服务器#2上运行,并执行:

1)从服务器#2连接并validation到远程服务器#1

2)只复制服务器#1中匹配如此命名的文件的文件:

Monthly_Review[1001-8754].journal 

3)将这些文件移动到服务器#2上的pathD:/ Path / NotIntegrated

我不是一个Windows服务器pipe理员,并与Linux一起工作多年,所以任何build议/帮助,让我去是很好的。

谢谢

更新似乎PowerShell是这个任务的正确工具。 (感谢@Ryan Ries)我在Windows XP上进行了本地testing,这似乎只适用于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) } 

电源shell。 您没有提及服务器是否在AD域中。 在这种情况下,身份validation将是无缝的,但是我猜测他们没有join域,因此您必须在脚本中提供凭据,除非您想手动键入凭证。

首先将密码存储到如下文件中:

 Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File password.txt 

密码将被混淆,但未encryption。 但是这比纯文本还要好一点。 然后在您的脚本中,从该文件中读取密码并使用它来validation您的其他服务器。

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

这个例子是用PS3编写的。你可能没有PS3,所以你可能需要稍微调整脚本。 例如,我认为Get-ChildItem cmdlet上的-File开关在PS 3中是新的。

编辑:移动parenthsis

编辑2 🙁 OP你可能不关心这个,这是更多的托尼罗斯的后续问题。)System.Security.SecureString类的优点,而不是普通的System.Strings,但它们涉及到保护数据,并减less其攻击面而它在内存中(例如,进程内存转储不会暴露您的SecureStrings。)但是将SecureString中的数据写入磁盘是我的意见,而不是SecureStrings的真正意图使用的方式。

SecureStrings使用对称密钥(也不存储在该进程的内存中)来encryption和解密数据。 我相信通过使用臭名昭着的SystemFunction041来调用advapi32.dll可以获得关键字。 这意味着系统的引导键被涉及。 如果用于SecureStrings的密钥只是bootkey或从bootkey派生出来的,那么这意味着SecureString可以被该机器上的任何人以足够的权限解密。 但是我不知道SecureString密钥是否与用户的密码哈希相结合的系统bootkey? 如果是这样的话,我们也可以很容易地弄清楚。 (查找DPAPI密钥pipe理进一步研究。)

如果你把你的文本文件放到另一台机器上,即使你使用相同的用户名和密码login到另一台机器,你也会发现你的文本文件现在是无用的。 您必须为每台新机器生成一个新的。 我认为这强化了我关于Bootkey的假设,因为它在每个系统上都是独一无二的。 但是同一台机器上的用户A和用户B不能破译对方的文本文件,因此除了机器特定的数据之外,还必须使用一些用户特定的数据来提供密钥。