Как отфильтровать Powershell для сравнения имени каталога с AD SamAccountName и игнорирования шаблона .Vx? - PullRequest
0 голосов
/ 16 июня 2020

Моя учетная запись пользователя AD имеет формат: Первый.Последний имя (SamAccountName). Перемещаемый профиль пользователя HomeDirectory каким-то образом получил дополнительное управление версиями, как показано ниже:

\\FileServer\RoamingProfiles\UserData$\User10.Name.V1
\\FileServer\RoamingProfiles\UserData$\User28.Name.V2
\\FileServer\RoamingProfiles\UserData$\User6.Name.V3
\\FileServer\RoamingProfiles\UserData$\User3.Name.V3.old
\\FileServer\RoamingProfiles\UserData$\User23.Name.V6
\\FileServer\RoamingProfiles\UserData$\User81.Name.V8.OLD
\\FileServer\RoamingProfiles\UserData$\User61.Name.V9
\\FileServer\RoamingProfiles\UserData$\User73.Name.V12
\\FileServer\RoamingProfiles\UserData$\User33.Name.V5
\\FileServer\RoamingProfiles\UserData$\User74.Name.V2
\\FileServer\RoamingProfiles\UserData$\First.LastName.RENAME

Как изменить сценарий Powershell ниже, чтобы получить только шаблон First.Last name (SamAccountName) из списка каталогов выше?

$ServerHomeDirShare = "\\FileServer\RoamingProfiles\UserData$\"
$filter = "(Enabled -eq 'true')"

# get all user accounts from AD; only SamAccountName required
$users = Get-ADUser -Filter $filter | Select-Object -ExpandProperty SamAccountName

# foreach directory in \\server\share check if it has a corresponding ad user
Get-ChildItem -Path $ServerHomeDirShare -Directory |
Select-Object -Property `
              Name,
              @{ n = 'AD User Exist'; e = { $users -contains $_.Name } },
              FullName,
              @{ n = 'LastAccessTime'; e = { $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss') } },
              @{ n = "Directory Size (MB)"; e = {
                    Try
                    {
                        $Path = $_.FullName
                        $Size = ((Get-ChildItem -Path $Path -ErrorAction Stop).Length).Sum/1MB
                        [math]::Round($Size, 2)
                    }
                    Catch
                    {
                        "ERROR: $($_.Exception.Message)"
                    }
                }} |
Where-Object { -not $_.'AD User Exist' } |
Export-Csv -NoTypeInformation -Path C:\UserProfilesNotExist-Size.csv

Таким образом, его можно сравнить с базой данных AD для разделения потерянных домашних каталогов.

1 Ответ

1 голос
/ 16 июня 2020

Вы можете использовать регулярное выражение -replace в имени каталога, чтобы получить только часть Firstname.Lastname, пропуская .Vx и .RENAME (или .WhatEver)

Далее, для вашего расчета размера каталога, я полагаю, вам нужен общий размер, включая содержимое вложенных папок, поэтому я бы тоже изменил этот метод:

$ServerHomeDirShare = '\\FileServer\RoamingProfiles\UserData$'
$filter = "(Enabled -eq 'true')"

# get all user accounts from AD; only SamAccountName required
$users = Get-ADUser -Filter $filter | Select-Object -ExpandProperty SamAccountName

# foreach directory in \\server\share check if it has a corresponding ad user
# user SamAccountNames are in format 'FirstName.Lastname', so we need to cut off
# any versioning postfixex from the directory names in order to compare
Get-ChildItem -Path $ServerHomeDirShare -Directory |
Select-Object -Property Name,
              @{ n = 'AD User Exist'; e = { $users -contains ($_.Name -replace '^(\w+\.\w+).*', '$1') } },
              FullName,
              @{ n = 'LastAccessTime'; e = { $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss') } },
              @{ n = "Directory Size (MB)"; e = {
                        Try {
                            $Size = (Get-ChildItem -Path $_.FullName -Recurse -ErrorAction Stop | 
                                     Measure-Object Length -Sum).Sum / 1MB
                            [math]::Round($Size, 2)
                        }
                        Catch {
                            "ERROR: $($_.Exception.Message)"
                        }
                    }
                } |
Where-Object { -not $_.'AD User Exist' } |
Export-Csv -NoTypeInformation -Path C:\UserProfilesNotExist-Size.csv

Другой подход может заключаться в фильтрации только каталогов, имя которых не может быть найдено в массиве $ users сразу, а не после. В этом случае вам не понадобится столбец «AD User Exist», потому что вы знаете, что это потерянные пользовательские папки.

Get-ChildItem -Path $ServerHomeDirShare -Directory | 
Where-Object { $users -notcontains ($_.Name -replace '^(\w+\.\w+).*', '$1') } |
Select-Object -Property Name, FullName,
              @{ n = 'LastAccessTime'; e = { $_.LastAccessTime.ToString('yyyy-MM-dd HH:mm:ss') } },
              @{ n = "Directory Size (MB)"; e = {
                        Try {
                            $Size = (Get-ChildItem -Path $_.FullName -Recurse -ErrorAction Stop | 
                                     Measure-Object Length -Sum).Sum / 1MB
                            [math]::Round($Size, 2)
                        }
                        Catch {
                            "ERROR: $($_.Exception.Message)"
                        }
                    }
                } |
Export-Csv -NoTypeInformation -Path C:\UserProfilesNotExist-Size.csv

Детали регулярного выражения

^                Assert position at the beginning of the string
(                Match the regular expression below and capture its match into backreference number 1
   \w            Match a single character that is a “word character” (letters, digits, etc.)
      +          Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   \.            Match the character “.” literally
   \w            Match a single character that is a “word character” (letters, digits, etc.)
      +          Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)               
.                Match any single character that is not a line break character
   *             Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...