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

在Windows服务中,我想检查存储在每个用户的HKCU注册表区域中的一些用户首选项。 我怎样才能做到这一点?

我看到HKEY_USERS有每个用户登录到机器的子键(或类似的东西?),其中包括每个用户的HKCU区域。 但是,这些子键是用户的SID,所以不知怎的,我需要计算出当前登录用户的SID。

然后,我将查询HKEY_USERS\\whichever\key\i\need代替查询HKEY_CURRENT_USER\whichever\key\i\need

从这个问题我可以获得DOMAIN \ USER格式的机器上当前用户的列表。 有没有办法从他们的Windows登录获取用户的SID? 或者是否有更直接的方法来获取当前登录用户的HKCU注册表路径?

以下是将用户名转换为SID的示例: 将用户名转换为C#/ .NET中的SID字符串

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList您将找到现有配置文件的SID。 ProfileImagePath将给出配置文件的路径。

大多数情况下,此路径是用户名。 但是,如果在创建配置文件时已存在类似路径,则可能是另一条路径。

短SID如S-1-5-18(=>本地系统)是默认本地帐户( https://support.microsoft.com/en-us/kb/243330

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

  1. 模拟用户凭据并从该模拟上下文访问HKCU
  2. 直接从磁盘读取注册表文件(这具有线程和数据完整性含义)。

我不是百分百肯定#1会起作用,但我相信它会。

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

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

使用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 

奖励:使用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