Резервное копирование объектов групповой политики на основе отображаемого имени объекта групповой политики, а не идентификатора

Итак, я делаю резервную копию всех объектов групповой политики контроллера домена и заметил, что способ, которым командлет Backup-GPO выполняет резервное копирование GPOS, очень недружественный. По умолчанию он создает папку для каждого отдельного объекта групповой политики с именем «ID», который даже не соответствует его «GPOID/GUID».

Вот пример, я просто сделаю резервную копию определенного объекта групповой политики:

backup-gpo -guid ff8de365-0842-46ab-9ac7-64ebd8dd4614 -path C:\


DisplayName     : N12 Workstation Policy
GpoId           : ff8de365-0842-46ab-9ac7-64ebd8dd4614
Id              : dd33c220-bac8-4ebd-a9d9-7729fcea9c38
BackupDirectory : C:\
CreationTime    : 20/10/2015 17:41:43
DomainName      : martyn.local

Это имя папки резервного копирования, которое создается после выполнения предыдущей команды:

{DD33C220-BAC8-4EBD-A9D9-7729FCEA9C38}

Если я попытаюсь сделать резервную копию всех объектов групповой политики, я получу папку для каждого объекта групповой политики. Есть ли способ назвать эти папки на основе отображаемого имени объекта групповой политики, а не этой недружественной строки?

Вот что я хотел бы получить:

N12 Workstation Policy

Причина, по которой я хочу сделать это таким образом, заключается в том, что если я захочу повторно импортировать один объект групповой политики в будущем и не помню имя объекта групповой политики, как я должен узнать, какая папка резервного копирования объекта групповой политики подходит для импортировать, если я использую это ужасное имя?

Спасибо


person miticoluis    schedule 21.10.2015    source источник


Ответы (1)


Сделайте резервную копию каждого объекта групповой политики в отдельные подпапки папки резервного копирования:

$invalidChars = ':\\/' + [RegEx]::Escape(-join [IO.Path]::InvalidPathChars)

$backupDir = 'C:\backup'
Get-GPO -All | ForEach-Object {
  $name = $_.DisplayName -replace "[$invalidChars]", '_'
  $gpoDir = Join-Path $backupDir -ChildPath $name
  New-Item $gpoDir -Type Directory | Out-Null
  Backup-GPO -Guid $_.Id -Path $gpoDir
}

Замена заключается в удалении недопустимых символов в пути из имени (создание подпапки завершилось бы неудачей, если бы имя объекта групповой политики содержало, например, >). Как предложил @briantist в своем комментарии, лучше получить список недопустимых символов из соответствующего свойства IO.Path, чем поддерживать список вручную. Однако вам может потребоваться вручную добавить другие проблемные символы, в частности :. Двоеточие используется для доступа к альтернативные потоки данных, так что технически это допустимый символ в пути, но PowerShell его не поддерживает.

person Ansgar Wiechers    schedule 21.10.2015
comment
Отличная работа; опередить меня. Мне нравится $name = $_.DisplayName -creplace "[$([RegEx]::Escape(([System.IO.Path]::InvalidPathChars) -join ''))]", '_', чтобы убедиться, что вы заменили все. - person briantist; 21.10.2015
comment
@briantist Действительно. Исправлено. - person Ansgar Wiechers; 21.10.2015
comment
ооо хорошее использование унарного -join! - person briantist; 21.10.2015
comment
Снимаю шляпу перед вами, ребята, мне есть чему у вас поучиться :) - person miticoluis; 21.10.2015
comment
Плохая новость: предыдущий сценарий дает сбой для определенного объекта групповой политики с именем Mapped Drive M: \\Atlantis\Muser New-Item : формат данного пути не поддерживается. Этот GPO является уникальным, который включает в себя двоеточие: я думаю, что $invalidChars не принимает во внимание знак: - person miticoluis; 22.10.2015
comment
Ошибка ':' устранена, но все еще не работает. Похоже, что теперь он не находит указанный путь: Backup-GPO: система не может найти указанный путь. (Исключение из HRESULT: 0x80070003) В C:\GPOBackup.ps1:76 char:13 + Backup-GPO ‹‹‹‹ -Guid $_.Id -Path $gpoDir - person miticoluis; 23.10.2015
comment
Созданная папка называется Mapped Drive M_, разве она не должна называться Mapped Drive M_ __Atlantis_Muser? - person miticoluis; 23.10.2015
comment
Это зависит от фактического значения свойства DisplayName. - person Ansgar Wiechers; 23.10.2015
comment
Я тоже заметил, что значение DisplayName - это Mapped Drive M_ \\Atlantis\Muser, поэтому происходит сбой. Это значение $invalidChars :‹›\| ☺☻♥♦\t\n♂\f\r♫☼►◄↕‼¶§▬↨↑↓→ ←∟↔▲▼ - person miticoluis; 23.10.2015
comment
'\' является частью $invalidChars, я просто не знаю, почему он не заменяет его на '_' - person miticoluis; 23.10.2015
comment
Ах, нет. Обратная косая черта в этом списке экранирует следующие символы (\| = символ вертикальной черты, \t = табуляция, \n = новая строка и т. д.). Вам нужно вручную добавить \/) к $invalidChars. Смотрите обновленный ответ. - person Ansgar Wiechers; 23.10.2015
comment
отсортировано, на этот раз сработало как шарм. Бесконечно благодарен - person miticoluis; 23.10.2015