首页 > 解决方案 > 如何将 Powershell CanonicalName 格式化为单独的列?

问题描述

我试图将下面的结果分开,以便可以将名为 CanonicalName 的一列分成:CanonicalName, ComputerName, DateEncrypted

代码:

$includeOUs = @(
   'Laptops'
    'Laptop'
   'Remote Offices'
) | ForEach-Object {
   If ($ou = Get-ADOrganizationalUnit -Filter "name -eq '$($_)'" -Properties canonicalName) {
      $ou
   }
   Else {
      Throw "OU '$($_)' not found!"
   }
}

$includeOUs | 
Select-Object -ExpandProperty DistinguishedName | 
Foreach-Object{
        Get-ADObject -ldapfilter "(msFVE-Recoverypassword=*)" -Searchbase $_ -Properties canonicalname,msfve-recoverypassword,msTPM-OwnerInformation | 
Select-Object canonicalname,msfve-recoverypassword,msTPM-OwnerInformation
    } | 
Out-GridView

注意:在不同的地理位置,OU 的名称是相同的。

domain.com/Site1/Laptops
domain.com/Site2/Laptops
domain.com/Site3/Laptops 

属性msTPM-OwnerInformation总是为空有什么原因吗?

结果:

标签: powershell

解决方案


研究表明,“msTPM-OwnerInformation”和“msTPM-TpmInformationForComputer”属性仅在某些情况下填充,例如强制通过 GPO 时。而且,BitLocker 确实可以在没有它们的情况下启用。澄清 TPM 所有者密码与 BitLocker 恢复密钥或密码不同。

BitLocker 常见问题解答

另外:TPM 基础

在研究、实际测试和直接观察之间,我不得不得出结论该列是空的,因为数据可能不存在。

注意:经受@Theos 正确观察

为您最后评论如何拆分 CanonicalName。由于几个原因,这有点难以回答。首先,不清楚您在寻找什么,我们没有示例输出可供参考。其次,我可能想以不同的方式处理整个问题。例如,可能使用更擅长获取子对象的 AD 提供程序。或者,我可能会尝试在计算机对象与其包含的恢复密码之间建立关系,以便正确制作报告。这些只是头脑风暴的建议。

当前代码返回“msFVE-RecoveryInformation”对象,因此您看到的规范名称是准确的。这是因为它是计算机的子对象。而且,这是您的过滤器的结果。只有 objectClass msFVE-RecoveryInformation 会匹配"(msFVE-Recoverypassword=*)"。分解 canonicalName 的一种非常粗略的方法可能是:

$includeOUs | 
ForEach-Object { Get-ADObject -ldapfilter "(msFVE-Recoverypassword=*)" -Searchbase $_ -Properties $ObjProps } | 
Select-Object ObjectClass,
    @{ Name = 'ComputerPath'; Expression = { $_.CanonicalName.SubString(0, ($_.CanonicalName.LastindexOf('/') -1 ) ) } },
    @{ Name = 'RecoveryPasswordName'; Expression = { $_.CanonicalName.Split('/')[-1] } },
    msfve-recoverypassword

注意:还有其他一些变化

注意:每台计算机可能有超过 1 个恢复密码。这取决于该机器上有多少 voumes 被加密和/或存储在 AD 中。例如,Exchange 服务器可能在 AD 中存储了数十个恢复密码……我们在这里讨论的表格输出中的数组可能格式不正确。


推荐阅读