我对 powershell 还不熟悉,但我的任务是弄清楚如何在我们域中的每个工作站上创建和运行 powershell 脚本,以便它提取 Bitlocker 状态,然后将信息写入 csv 文件。我们使用 labtech 作为我们的远程系统,因此我们希望在每台机器上运行该脚本,因为我们的工程师不希望在 DC 本身上运行任何东西(最初打算从 OU 中提取所有工作站名称,然后检查每个工作站的状态)。问题是,似乎第一台运行脚本的机器会创建文件,然后取得所有权,从而有效地锁定所有其他机器,使其无法写入文件。任何能引导我朝着正确方向的建议都将不胜感激。谢谢。
$Computer = hostname
Write-Host "Getting Bitlocker Status..." -ForegroundColor Green
function ErrorLog {
$ErrorMessage = $_.Exception.Message
$Date = Get-Date
$Date ERROR: "$ErrorMessage" | out-file *path* -Append
exit
}
try
{
$Status = manage-bde C: -cn $Computer -status | Select-String "Conversion Status:", "Percentage Encrypted:", "Protection Status:", "Lock Status:"
}
catch
{
ErrorLog
}
finally
{
$Date = Get-Date
"$Date Successful BitLocker Check" | out-file *path* -Append
}
Write-Host "Sending info to CSV file..." -ForegroundColor Green
try{
$ConvStatus = $Status.line | Select-String "Conversion Status:"
$Percentage = $Status.line | Select-String "Percentage Encrypted:"
$LockStatus = $Status.line | Select-String "Lock Status:"
$Object = New-Object PSObject -Property @{
ComputerName = $Computer
ConversionStatus = $ConvStatus.ToString().trim("Conversion Status:")
PercentageEncrypted = $Percentage.ToString().trim("Percentage Encrypted:")
LockStatus = $LockStatus.ToString().trim("Lock Status:")
}
$Object | Select-Object ComputerName, ConversionStatus, PercentageEncrypted, LockStatus | Export-CSV *path* -NoTypeInformation -Append -Force
}
catch {
ErrorLog
}
finally
{
$Date = Get-Date
"$Date CSV written to $Path" | out-file *path* -Append
}
答案1
让所有计算机同时写入同一个文件并不是一个好的解决方案。从域中的一台中央计算机查询所有工作站的 Bitlocker 状态会更好。
要使用的命令是 管理bde,例如用作:
manage-bde -status -computername WS12345 C:
这可能会产生以下输出:
您可以编写一个脚本,将信息收集到一个 CSV 文件中。
参考 :
- 检查远程 Windows 计算机的加密状态
- Technet PowerShell 脚本 远程查询指定 OU 中找到的每台计算机(使用 manage-bde.exe)以确定 BitLocker 保护是打开还是关闭,并以颜色编码的输出进行相应报告。结果将保存到 CSV 文件中,并通过电子邮件发送给指定收件人。只需根据需要更改必要的变量并运行即可。
- Technet PowerShell 脚本 获取多台计算机的 BitLocker 加密状态。
答案2
您可以简单地调用 icacls 来向所有人授予完全访问权限:
icacls myfile.csv /grant everyone:F
注意每个人取决于语言环境,因此如果您不使用英语,则应使用其他名称。
以下是文章描述了如何用 Powershell 方式执行此操作。它有点长,在这种情况下,我自己更喜欢上面的一行代码。我对该页面中的示例进行了一些修改:
$Path = 'myfile.csv'
$Acl = (Get-Item $Path).GetAccessControl('Access')
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule('Everyone', 'FullControl', 'Allow')
$Acl.SetAccessRule($Ar)
Set-Acl -path $Path -AclObject $Acl
顺便问一下,您是否考虑过如果两台电脑同时写入该文件会发生什么?
答案3
我成功说服了我们的工程师做出一些更改,现在我已成功通过我们的 UTIL 服务器运行我的原始脚本。感谢大家的帮助!