如何从服务访问当前登录用户的HKCU注册表?

时间:2010-03-02 17:46:51

标签: c# .net pinvoke registry

在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注册表路径?

5 个答案:

答案 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)

为此,您需要执行以下操作之一

  1. 模拟用户凭据并从该模拟上下文访问HKCU
  2. 直接从磁盘读取注册表文件(这会影响线程和数据完整性)。
  3. 我不是100%确定#1会起作用,但我相信它会。

    对于任一解决方案,您需要在流程中使用用户凭据或访问令牌。这不容易获得,因为这是一个安全问题。

答案 3 :(得分:1)

您可以连接到他们的远程注册表,然后在整个HKU密钥中搜索他们的用户名(即jsmith)。各种条目引用其用户档案;这些将弹出,然后您可以查看这些条目所在的SID。有点迂回的做法,但似乎有效。

答案 4 :(得分:0)

使用PowerShell可以匹配它们:

Get-ItemProperty -path  "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\*" | select ProfileImagePath, PSChildName

enter image description here

您甚至可以通过用户名搜索(例如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