使用 Powershell 清理孤立的 Active Directory 用户配置文件文件夹

Posted

技术标签:

【中文标题】使用 Powershell 清理孤立的 Active Directory 用户配置文件文件夹【英文标题】:Using Powershell to clean up orphan Active Directory user profile folders 【发布时间】:2016-12-20 21:11:19 【问题描述】:

任务似乎微不足道!很多用户在我们的环境中来来去去。时不时地我想检查“孤立”漫游配置文件文件夹并摆脱它们。如果用户名与文件夹名称完全匹配但不适用于 Windows 添加了 .V2、.V3 等的文件夹,则我的代码有效。 -eq 有效,但不适用于 -like 或 -contains,或者我尝试插入通配符的任何方式。我尝试了 where-object 构造,但也失败了。

例如,如果我们有一个用户 bob.smith,我不想让我的“孤立”列表包含名为 bob.smith 或 bob.smith.V2 的配置文件文件夹。

这是我的代码:

# Put profile folder names in array

$profilefolders = Get-ChildItem -Name "\\server\profiles$"



# Initialize arrays 

 $orphanprofiles = @()



foreach ($userprofile in $profilefolders)
    
#  Do profile names match up with user accounts?
    If(Get-ADUser -Filter SamAccountName -eq $userprofile)

        
        # User account exists: no action
        

    Else
        
        # Profile is an orphan. Add to list.
        $orphanprofiles += $userprofile
                         
                




# put array values in a string variable with newline char for screen   output
$outputprofiles = $orphanprofiles -join "`n"

Write-Output "`n"
Write-Output "Orphan profiles: `n$outputprofiles"
Write-Output "  "

【问题讨论】:

【参考方案1】:

将第一行改为:

$profilefolders = Get-ChildItem -Name "\\server\profiles$"|where $_ -notmach '.*\.V\d$'

想出了一个更好的解决方案。它使用 RegEx 将 .V2 扩展名与文件夹名分开,因此检查没有该扩展名的名称。 不需要中间的 $profilefolders。

# Initialize arrays 
$orphanprofiles = @()
$pattern = '^(.*?)(\.V\d)$'

Get-ChildItem -Name "\\server\profiles$"| 
    ForEach 
        If ($_ -match $pattern) 
            If (!(Get-ADUser -Filter SamAccountName -eq $matches[1]))
                $orphanprofiles += $_ else 
         Else 
            If (!(Get-ADUser -Filter SamAccountName -eq $_))
                $orphanprofiles += $_
        
    


# put array values in a string variable with newline char for screen   output
$outputprofiles = $orphanprofiles -join "`n"
Write-Output "`n"
Write-Output "Orphan profiles: `n$outputprofiles"
Write-Output "  "

【讨论】:

太棒了!第一个答案有效,第二个生成一堆红色,从 !在第 8 行。里面有很多东西我不明白,所以我会去阅读它。非常感谢您对学习曲线的提升。 该死! #1 不是答案:我不想忽略每个附加了 .Vx 的文件夹,只需忽略其中的 .Vx 部分。 @SKaye 我更改了第二个脚本,增加了一对带有 `!` not 运算符的括号。家里没有AD,所以无法测试。 感谢 LotPings,我还通过添加双引号消除了红色,例如 If ("!Get-ADUser -Filter SamAccountName -eq $matches[1]")【参考方案2】:

非常感谢@LotPings。这是我现在的代码(包含所有调试语句):

# Initialize array
$orphanprofiles = @()

# set regex pattern
$pattern = '^(.*?)(\.V\d)$'

Get-ChildItem -Name "\\server\profiles$"| 
    ForEach 
        Write-Host "Testfolder: " $_
        If ($_ -match $pattern) 
        
          Write-Host "Loop 1 Foldername " $_
          Write-Host "Loop 1 Match " $matches[1]
          $Vnuser = $matches[1]

            If(Get-ADUser -Filter SamAccountName -eq $Vnuser)
                
             # match: do nothing
                
               Else 
                
                $orphanprofiles += $_
                Write-Host "Loop one inside If statement: " $_
                


     

      Else
        
           Write-Host "Folders without .Vn: " $_
           If(Get-ADUser -Filter SamAccountName -eq $_)
                
                # match: do nothing
                
            Else
                
                $orphanprofiles += $_
                Write-Host "Loop 2 foldername: " $_
                

    

   



# put array values in a string variable with newline char for screen output
$outputprofiles = $orphanprofiles -join "`n"
Write-Output "`n"
Write-Output "Orphan profiles: `n$outputprofiles"
Write-Output "  "

【讨论】:

以上是关于使用 Powershell 清理孤立的 Active Directory 用户配置文件文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如果服务器错误 401,防止 Restkit 删除孤立对象

linux用shell命令怎样清理系统缓存

powershell 清理Imsim安装(Windows)

powershell UT3重复配置文件清理

powershell 在SysPrep之前清理图像

powershell 文件夹清理