我不是在寻找“$env:HOMEDIR”,而是在寻找一种方法来查询不同用户帐户的主目录。相当于“~bob”的 powershell。
我尝试使用 [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>
最佳答案
你可以结合Get-CimInstance
与 Get-LocalUser
:
$userName = 'other.user'
(
Get-CimInstance Win32_UserProfile -Filter "SID = '$((Get-LocalUser $userName).Sid)'"
).LocalPath
这会输出目标用户的个人资料目录的路径,例如C:\Users\other.user
。
注意:个人资料目录通常,但不一定与用户的家 目录 - 后者可以配置为指向其他地方,例如网络共享,并反射(reflect)在当前用户的对环境变量中,HOMEDRIVE
和 HOMEPATH
。
获取真正的home目录:
如果目标用户存储在 Active Directory 中,则以下可能有效(未经测试):
$userName = 'other.user' $user = Get-ADUser $userName -Property HomeDrive, HomeDirectory '{0}{1}' -f $user.HomeDrive, $user.HomeDirectory
对于本地用户:
鉴于
HOMEDRIVE
和HOMEPATH
环境变量是动态添加到注册表,当该用户登录到窗口站(创建操作系统 session )时,在HKEY_CURRENT_USER\Volatile Environment
下。相比之下,如果您按需将另一个用户的配置文件(位于用户配置文件目录中的隐藏NTUSER.DAT
文件)加载到注册表中,例如通过reg.exe load
或通过CreateProcessWithLogon()
WinAPI 函数(也被runas.exe
[1] 使用),未添加这些值。如果有人知道主目录信息是否包含在用户配置文件的非 volatile 信息中以及位于何处(加载后可通过注册表访问),请告诉我们知道。
至于你尝试了什么:
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%
的效果报告 %HOMEDRIVE%
作为 C:
和 %HOMEPATH%
作为 \Windows\System32
(!),基于 CreateProcessWithLogon() 的行为
,奇怪的是,它将这些变量设置为启动进程的工作目录,默认为 C:\Windows\System32
。
关于windows - 如何使用 Windows Powershell 检索不同本地用户的主目录/配置文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74281761/