在Windows服务中,我想检查存储在每个用户的HKCU注册表区域中的一些用户首选项。我怎么能这样做?
我看到HKEY_USERS有每个用户登记到机器的子键(或类似的东西?),其中包括每个用户的HKCU区域。但是,这些子键是用户的SID,所以不知怎的,我需要计算出当前登录用户的SID。
然后,我会查询HKEY_USERS\<the users SID>\whichever\key\i\need
,而不是查询HKEY_CURRENT_USER\whichever\key\i\need
。
从this question我可以获取DOMAIN \ USER格式的计算机上当前用户的列表。有没有办法从他们的Windows登录获取用户的SID?或者是否有更直接的方法来获取当前登录用户的HKCU注册表路径?
答案 0 :(得分:2)
以下是将用户名转换为SID的示例:Convert a username to a SID string in C#/.NET
答案 1 :(得分:2)
在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
中,您将找到现有配置文件的SID。 ProfileImagePath将提供配置文件的路径。
大多数情况下,此路径是用户名。但是,如果在创建配置文件时已经存在类似的路径,那么它可能是另一条路径。
短SID如S-1-5-18(=&gt;本地系统)是默认本地帐户(https://support.microsoft.com/en-us/kb/243330)
答案 2 :(得分:1)
为此,您需要执行以下操作之一
我不是100%确定#1会起作用,但我相信它会。
对于任一解决方案,您需要在流程中使用用户凭据或访问令牌。这不容易获得,因为这是一个安全问题。
答案 3 :(得分:1)
您可以连接到他们的远程注册表,然后在整个HKU密钥中搜索他们的用户名(即jsmith)。各种条目引用其用户档案;这些将弹出,然后您可以查看这些条目所在的SID。有点迂回的做法,但似乎有效。
答案 4 :(得分:0)
使用PowerShell可以匹配它们:
Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" | select ProfileImagePath, PSChildName
您甚至可以通过用户名搜索(例如john):
Get-ItemProperty -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" | ? {$_.ProfileImagePath -match "john"} | select ProfileImagePath, PSChildName
Bonus:使用PowerShell进行反向SID查找(将返回DOMAIN \ USERNAME)
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-2139915555-1840087203-3974481593-26737")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value