按displayname而非ID备份GPO-powershell

按displayname而非ID备份GPO-powershell,powershell,powershell-2.0,Powershell,Powershell 2.0,我想使用GPO的名称而不是ID备份GPO。目前我有: $GPO_Temp_Backup = get-gpo -all -domain $domain Foreach ($GPO in $GPO_Temp_Backup) { $GPOBackup = Backup GPO -name $GPO.DisplayName -path ($Current_Drive + $GPO_Backup_Location) -Domain $domain; write-host $GPO.DisplayNam

我想使用GPO的名称而不是ID备份GPO。目前我有:

$GPO_Temp_Backup = get-gpo -all -domain $domain

Foreach ($GPO in $GPO_Temp_Backup) {

$GPOBackup = Backup GPO -name $GPO.DisplayName -path ($Current_Drive + $GPO_Backup_Location) -Domain $domain;
write-host $GPO.DisplayName
}

我可以根据需要发布脚本的任何其他部分,但大多数缺少的变量值对于这个问题都不重要。到目前为止,它仍然将GPO作为其ID进行备份

我认为您可以使用$gpobackup.ID获取guid,将其转换为文件夹路径,然后简单地使用重命名。例如:

$GPOBackup = Backup-GPO -name $GPO.DisplayName -path ($Current_Drive + $GPO_Backup_Location) -Domain $domain;
$guidpath = $($Current_Drive + $GPO_Backup_Location + '{' + $x.id.tostring() + '}' )
$newpath = $($Current_Drive + $GPO_Backup_Location + $GPOBackup.DisplayName)
rename-item -Path $guidpath -newname $newpath

所以我决定稍微修改一下代码,这样我就可以调试正在发生的事情。我添加了
writeout$GPO备份
writeout$GPO
。有趣的是,这和我看到的很相似。(示例取自Microsoft网页)

注销$GPOBackup
为我提供了:

C:\PS>
Backup-Gpo -Name TestGPO -Path C:\GpoBackups -Comment "Weekly Backup"
DisplayName     : TestGPO
GpoId           : 35c12ab3-956c-45d5-973b-46b17d225f47
Id              : 2b509d4e-40f5-4337-82f7-458584555d0c
BackupDirectory : C:\GpoBackups
CreationTime    : 2/25/2009 8:48:19 PM
DomainName      : contoso.com
Comment         : Weekly Backup  
注销$GPO
为我提供了:

Id: 35c12ab3-956c-45d5-973b-46b17d225f47
DisplayName : TestGPO
Path: cn={35c12ab3-956c-45d5-973b-46b17d225f47}
正如您在第一个输出中看到的,有一个GpoId和一个Id。第二个命令的输出突然将Id更改为原来的GpoId。当
backup gpo
命令保存gpo时,它会使用从第一个代码块接收到的Id进行保存。然后,Id变为
GpoId
。我不知道为什么会发生这种情况,但无论如何,一旦我弄明白了这一点,对我来说,解决办法很简单。下面的代码允许我将GPO备份为
DisplayName

Foreach ($GPO in $GPO_Temp_Backup) {
$GPOBackup = Backup-GPO -name $GPO.DisplayName -path ($Current_drive + $GPO_Backup_Location + "\" + "{" + $GPO.Id + "}") -domain $domain
rename-item -path ($Current_drive + $GPO_Backup_Location + "\" + "{" + $GPOBackup.Id + "}") -newname $GPO.DisplayName
}
$oldfilename = ($Current_drive + $GPO_Backup_Location + "\" + "{" + $GPOBackup.Id + "}")
write $oldfilename

下面是我编写的一个小脚本,用于备份域中的所有GPO。这利用了备份GPO创建的manifest.xml文件来解决Id问题:

[CmdletBinding()]
param(
    [parameter()]
    [ValidateScript({Test-Path $_ -PathType Container})]
    [string]$Path = 'C:\GroupPolicy'
)

Get-GPO -All | Backup-GPO -Path $Path -Comment ('Backup taken: {0}' -f (Get-Date -Format G))
[xml]$manifest = Get-Content (Join-Path $Path 'manifest.xml')
foreach ($gpBackup in $manifest.Backups.BackupInst) {
    Rename-Item -Path (Join-Path $Path $gpBackup.Id.InnerText) -NewName ($gpBackup.GPODisplayName.InnerText -replace '[:\\/]','')
}