【问题标题】:Powershell Windows in a Domain: how to retrieve actual home directory of renamed user域中的 Powershell Windows:如何检索重命名用户的实际主目录
【发布时间】:2021-06-13 06:09:22
【问题描述】:

随着时间的推移,我们的组织经历了一些个人资料名称更改(即某人结婚时),并且还没有重命名用户主目录的标准。所以我们有像 MarySmith 这样的用户,他们的目录像 C:\USERS\MaryJones。到目前为止没有问题,但现在我们想清理这些以避免混淆。 (此处使用的 MarySmith / MaryJones 仅用于说明目的。)我们开始采取一些安全措施,消除这种“混乱”在此过程中发挥了作用。

因此,我们的第一步是确定发生这种情况的案例。在域控制器上,我们发出了这样的 PowerShell 命令,用于初步概念证明:

get-ADUser MarySmith -properties * | Export-CSV -path C:\SOME\PATH.csv

我们发现根本没有提到 MaryJones 文件夹。有一个 HomeDirectory 属性,但它是空的。

再深入一点,在 Active Directory 用户和计算机 (ADUC) 中,当我们为用户提取属性时,我们也没有看到配置文件路径、登录脚本、主文件夹......全为空的差异。然而,当用户 (MarySmith) 登录时,C:\USERS\MaryJones 中的 NTUSER.DAT 文件会更新。

谁能帮助我们了解如何检索正确的信息,以及 Windows 如何跟踪这些名称相关的事实?我相信,如果我们能够恢复这种关联,我们就可以消除一些问题。

谢谢, 丹尼斯

【问题讨论】:

  • 你有没有在这种环境中真正configured roaming profiles?听起来您所描述的只是 Windows 机器上的本地用户配置文件
  • Get-CimInstance -ClassName Win32_UserProfile 的调用会同时提供一个.SID 来识别用户和一个.LocalPath,它应该指向本地用户配置文件路径。
  • 谢谢,@Lee_Dailey - 这是向前迈出的一大步。不幸的是,我们仍然没有把所有的拼图都放在一个地方。我们在 Get-ADUser 中有可用的用户(它有一个 SID 属性),我们在 Get-CimInstance 中有可用的 SID(连同文件夹名称)。但看起来我们无法从 Get-CimInstance 中选择一个 SID(我试过 Get-CimInstance 后跟用户名,然后是 sid,但无济于事)。您知道将用户和路径放入一个对象的工具吗? (这一切都变得更加混乱,因为我们在一些计算机上有本地用户。我们现在将忽略它们。)
  • 应用一些过滤器怎么样? Get-CimInstance -ClassName Win32_UserProfile | Where-Object {$_.SID -eq 'S-1-5-21-...'} | Select-Object -Property SID, LocalPath 返回给定 SID 的 SID 和配置文件路径。
  • @Thomas Ithanks,我会玩这个。我们正在寻找一种从 C:\Users\OldName 到 UserName 的方法,而这可能会适得其反。我将在 Get-ADUser 和 Get-CimInstance 上使用 WHERE,看看我是否能在路上着陆。这是一个很好的推动,再次感谢。

标签: powershell user-management home-directory windowsdomainaccount


【解决方案1】:

感谢 cmets 中 @Lee_Daily 和 @Thomas 就该问题提出的建议,我们提出了一个可行的解决方案(有一些无法翻译(Try/Catch 很好地捕捉到了这个问题) - 理解后会更新答案)。

UPDATE 无法翻译的原因是 NTUSER.DAT 文件在关联用户从目录中删除后仍保留在系统中。 ***

以下是我们提出的脚本的相关部分:

$FOLDERS = Get-ChildItem -Path "C:\users\" 
ForEach ($FOLDER in $FOLDERS) {
    $NTUSER = $FOLDER.FullName + "\NTUSER.DAT"
    if (Test-Path $NTUSER) { # Profile file exists
    $SID = (Get-CimInstance -ClassName Win32_UserProfile | Where-Object {$_.LocalPath -like $FOLDER.FullName}).sid
        $USEROBJ = New-Object System.Security.Principal.SecurityIdentifier($SID)
        if ($USEROBJ -ne $NULL) {
            try {
                $USERNAME = $USEROBJ.Translate( [System.Security.Principal.NTAccount]).Value
                }
            catch [exception] {
                $USERNAME = $NULL
                }
            }
        if ($USERNAME -eq $Null) {
                Write-Host "Couldn't resolve user for $SID $FOLDER "
            }
        else {
            #Here we have a valid NTUSER path, and a profile name.
            #Now we can make miracles happen.
            A-Miracle-Happens($FOLDER.FullName, $USERNAME)
            }
        }
    }    

谢谢,伙计们。

【讨论】:

  • 您可以将 (... | Select-Object -Property SID).sid 替换为 ... | Select-Object -ExpandProperty SID(... ).sid 以获得更好的可读性。
  • 谢谢@Thomas。不确定您的意思,因为我已经指定了 (...).sid 。也许除了我上面所做的之外还有一条捷径?对不起,我不明白;我确信这是由于我对 PS 的经验有限。
  • 如果保持括号后跟.sid,可以省略| Select-Object -Property SID
  • A,知道了@Thomas。现在好多了。答案已更新。感谢大家的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2016-08-27
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多