如何使用Windows Powershell检索不同本地用户的主目录/配置文件路径

mnemlml8  于 2022-11-18  发布在  Windows
关注(0)|答案(2)|浏览(324)

我不是在寻找“$env:HOMEDIR”,而是在寻找一种查询不同用户帐户的home目录的方法。
我尝试使用[ADSI]:

# After creating a local account called 'other.user'
PS> $user = [ADSI]'WinNT://localhost/other.user,user'
PS> $user.name
other.user
PS> $user.HomeDirectory

PS>

即使在提升的powershell中从管理员帐户执行时也是如此。
出于理智考虑,我尝试对现有用户进行同样的检查:

PS> $user = [ADSI]('WinNT://localhost/{0},user' -f [Environment]::UserName)
PS> $user.name
this.user    # paraphrase
PS> $user.HomeDirectory

PS> $user.properties.HomeDirectory

PS>
lnxxn5zx

lnxxn5zx1#

您可以将Get-CimInstanceGet-LocalUser结合使用:

$userName = 'other.user'
(
  Get-CimInstance Win32_UserProfile -Filter "SID = '$((Get-LocalUser $userName).Sid)'"
).LocalPath

这将输出目标用户的profile 目录的路径,例如C:\Users\other.user

注意profile 目录 * 通常 * 是,但不一定与用户的 home 目录相同-后者可以配置为指向其他位置,如网络共享,并反映在当前用户的一对 * 环境变量中,即HOMEDRIVEHOMEPATH

要获取true home 目录,请执行以下操作:

  • 如果目标用户存储在Active Directory中,则以下 * 可能 * 有效(未经测试):
$userName = 'other.user'
$user = Get-ADUser $userName -Property HomeDrive, HomeDirectory
'{0}{1}' -f $user.HomeDrive, $user.HomeDirectory
  • 对于仅限本地用户
  • 我个人不知道有什么方法,因为HOMEDRIVEHOMEPATH环境变量是在用户登录到窗口工作站时 * 动态 * 添加到注册表中的(建立OS工作阶段)*,在HKEY_CURRENT_USER\Volatile Environment下。相比之下,如果加载了其他用户的配置文件(隐藏的NTUSER.DAT文件位于用户的配置文件目录中)按需导入注册表,例如通过reg.exe load或通过CreateProcessWithLogon() WinAPI函数[也被runas.exe [1]使用],则 * 不 * 添加这些值。
  • 如果有人知道主目录信息是否包含在用户配置文件的 * 非易失性 * 信息中以及包含在何处(加载后可通过注册表访问),请告诉我们。

至于你试过什么
System.DirectoryServices.DirectoryEntry(其类型加速器为[adsi])示例的相关属性 * 应该 * 为.Profile.HomeDirDrive/.HomeDirectory,但至少在我的Windows 10机器上,它们 * 没有填充 *;例如:

PS> ([adsi] 'WinNT://localhost/jdoe,user') | Format-List *

# ...
HomeDirectory              : {}
# ...
Profile                    : {}
HomeDirDrive               : {}
# ...

[1]请注意,类似runas.exe /profile /user:$userName cmd /c echo %HOMEDRIVE%HOMEPATH%这样的变量实际上会根据CreateProcessWithLogon()的行为将%HOMEDRIVE%报告为C:,将%HOMEPATH%报告为\Windows\System32(!),奇怪的是,CreateProcessWithLogon()会将这些变量设置为启动进程的 * 工作目录 *,默认为C:\Windows\System32

2j4z5cfb

2j4z5cfb2#

补充mklement0's helpful answer的另一种方法是直接查询注册表,这将Get-LocalUserGet-ItemPropertyValue组合在一起:

$sid = (Get-LocalUser other.user).Sid
Get-ItemPropertyValue "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\$sid" -Name ProfileImagePath

相关问题