我被要求代替一位同事编写一个将在服务器#2 上运行的 Windows 脚本,该脚本执行以下操作:
1)从服务器 #2 连接远程服务器 #1 并进行身份验证
2)仅从服务器#1复制与如下名称匹配的文件:
Monthly_Review[1001-8754].journal
3)将这些文件移动到服务器 #2 上的路径 D:/Path/NotIntegrated
我不是 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,因此可能需要稍微调整脚本。例如,我认为 Get-ChildItem cmdlet 上的 -File 开关是 PS 3 中的新元素。
编辑:移动了一个括号
编辑 2:(OP 你可能不关心这个,这更多的是针对 tony roth 的后续问题。)System.Security.SecureString 类相对于常规 System.Strings 有好处,但它们涉及保护数据并在数据在内存中时减少其攻击面(例如,进程内存转储不会暴露你的 SecureStrings。)但在我看来,将 SecureString 中的数据写入磁盘是一种黑客行为,而不是 SecureStrings 真正应该使用的方式。
SecureStrings 使用对称密钥(该密钥也不存储在该进程的内存中)来加密和解密数据。我相信该密钥是通过调用 advapi32.dll 获得的,使用的是臭名昭著的 SystemFunction041。对我来说,这意味着系统的启动密钥也参与其中。如果用于 SecureStrings 的密钥只是启动密钥或从启动密钥派生而来,则意味着该机器上任何具有足够权限的人都可以解密 SecureString。但我想知道 SecureString 密钥是否是系统启动密钥与用户密码哈希的组合?同样,如果是这样的话,我们也可以很容易地弄清楚。(查找 DPAPI 密钥管理以进行进一步研究。)
如果您将文本文件带到另一台机器上,即使是使用相同用户名和密码登录的另一台机器,您也会发现您的文本文件现在毫无用处。您必须为每台新机器生成一个新文件。我认为这加强了我关于启动密钥的假设,因为它在每个系统上都是唯一的。但同一台机器上的用户 A 和用户 B 无法解密彼此的文本文件,因此它必须使用一些用户特定的数据以及机器特定的数据来得出密钥。