背景
我在使用SCCM
推送一些APP或指定配置时,经常会有修改当前登录用户(HKEY_CURRENT_USER)
注册表的部分键值这类需求. 但在默认情况下使用SCCM推送,会以SYSTEM
权限去运行,按照常规的脚本并没法直接修改该计算机当前登录用户的注册表键值;并且我的环境里普通用户没有本地管理员权限,所以也没法以用户的身份去执行脚本。
思路
HKEY_USERS
包含计算机上所有主动加载的用户配置文件。HKEY_CURRENT_USER
是HKEY_USERS
的子项。
综上,我需要做的是通过PowerShell
分步实现以下目标,然后才能有可能满足上述需求。
- 获取当前登录用户的用户名;
- 使用用户名获取已登录用户的
SID
; - 基于用户
SID
,在HKEY_USERS
里找到该用户的注册表配置项; - 为当前登录的用户配置指定的注册表项、键值;
代码
#1.获取当前登录用户;
$CurrentLogonUser = (Get-WMIObject -query "SELECT * FROM win32_Process WHERE Name ='explorer.exe'" | Foreach { $owner = $_.GetOwner(); $_ | Add-Member -MemberType "Noteproperty" -name "Owner" -value $owner.User -passthru }).Owner | select-object -first 1
#2.获取当前用户的SID;
$user = New-Object System.Security.Principal.NTAccount($CurrentLogonUser)
$sid = $user.Translate([System.Security.Principal.SecurityIdentifier])
$CurrentUserSID = $sid.Value
#3.访问HKEY_USERS\$CurrentUserSID\创建或修改当前登录用户的相关键值(以下均为演示);
New-Item -Path Registry::HKEY_USERS\$CurrentUserSID\SOFTWARE\ITPro\TEST\Login -Force #创建项
New-ItemProperty -Path Registry::HKEY_USERS\$CurrentUserSID\SOFTWARE\ITPro\TEST\Login -Name 'Jason' -PropertyType DWord -Value '1' -Force #创建键值
#Remove-ItemProperty -Path Registry::HKEY_USERS\$CurrentUserSID\测试CurrentUser -Name "test" #删除键值
#Remove-Item -Path Registry::HKEY_USERS\$CurrentUserSID\测试CurrentUser #删除项
测试
这里简单手动做个测试: 1.先在注册表中访问HKEY_CURRENT_USER
然后在其子目录中创建测试项和值 2.基于上述命令,查找当前用户的SID
3.然后访问HKEY_USERS\SID
验证刚才创建的项是否存在
通过手工操作,验证了当前用户的HKEY_CURRENT_USER
的位置等于HKEY_USERS\SID\
再通过SCCM推送脚本至测试计算机,验证是否能够达到预期的效果.脚本是删除刚才创建的HKEY_CURRENT_USER\测试CurrentUser里的TEST
值,并创建\SOFTWARE\ITPro\TEST\Login项以及Jason=1的值
经验证脚本效果与我们需求一致。 Enjoy~ ::twemoji:cool::