使用 Windows 帐户列表通过 SIDS 添加注册密钥



编辑重新解释以改进答案。

项目

作为第三方工程师,我正在参加一个安装软件的站点。基础设施"非常"被锁定。我将在当天获得一个管理员帐户来安装该软件。但是,为了使软件正常工作对于所有用户(不仅仅是管理员登录),IT部门指示我手动创建一个KEY,然后在PC上每个用户帐户的创建密钥中添加一个字符串值。我们在标准环境中的软件通过所有用户注册密钥来满足这一点,但它在这些特定位置不运行(不允许 - 不要问!

他们想要密钥的位置位于注册表中的HKEY_USERS路径内:-

HKEY_USERS\

S-1-5-21-XXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Microsoft XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX因此,假设有2个人登录了这台PC,他们稍后需要使用我们的软件

约翰·琼斯

玛丽·雪莱

我需要找到与约翰琼斯有关的 sid,然后去添加他的部分的密钥HKEY_USERS

然后我需要找到玛丽·雪莱·西德,然后去找她HKEY_USERS部分的钥匙,等等。

现在我知道从我工作的环境中可能有 20 + 个用户计数,所以真的希望避免为我正在安装的每台 PC 上的所有帐户一遍又一遍地手动添加它们的密钥。

登录脚本会更好,但这是我目前必须处理的全部内容。

现在的脚本状态

@echo off
REM Read file with user names
FOR /F "usebackq tokens=*" %%G in ("users.txt") do (
REM use user name to find SID
FOR /F "delims=" %%H IN ('"wmic useraccount where name='%%~G' get sid| findstr /vi "SID""') DO (
REM Strip trailing line with CR
FOR /F "delims= " %%I IN ("%%~H") DO (
REM %%I is now the SID of the USER
REG ADD "HKEY_USERS%%ISoftwareMicrosoftaddstuffhere" /f
REG ADD "HKEY_USERS%%ISoftwareMicrosoftaddstuffhere" /t REG_SZ /d "addstuffhere"" /f
)
)
)

这几乎是按计划自动化整个事情;循环访问使用PC的用户的用户名的文本文件,获取SID,将sid作为变量应用,然后用于在正确的位置为该用户写入密钥,并通过列表对列出的每个帐户执行相同的操作。

唯一可能需要更改的部分是 WMIC 部分没有找到某些拥有真正 Windows 帐户的用户。

当我在笔记本电脑上测试工作代码时,它适用于我的管理员帐户,但我以joe_blogs身份登录(例如)出现"没有可用的实例"。因为孤立地,WMIC 代码只调出了几个不是全部,所以无法做它需要做的事情。

我从之前的问题中知道这个 WMIC 代码会显示每个帐户:-

WMIC Path Win32_UserProfile Where "Special='False' And Not LocalPath='Null'" Get LocalPath,SID | find /v ""

也许这可以合并到当前的工作代码中,以确保每个帐户都得到满足。

我知道用户都需要在每台PC上登录才能正常工作,因此关于用户配置文件列表,我可以在当天询问"您的哪些用户需要在PC上使用我们的东西"并让用户.txt

谢谢 - 希望这真的能解释它:/

编辑要求我执行的操作的说明(为了隐私,稍微更改了密钥名称)

1. Log on to the PC with a standard technician admin account
2. Open regedit.exe
3. Navigate to* HKEY_USERSS-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX-     XXXXXSoftwareMicrosoftTerminal Server ClientDefaultAddins
a. Right-click Addins > New > Key and create foo
b. Right-click foo > New > String Value and create Name
c. Double-click Name and in Value Data enter† C:foofilefoo.dll
4. Repeat step 3 for each user: it should be possible to edit the SID in an exported key by right-clicking on the next 
HKEY_USERS entry > Rename > Ctrl+C > Esc then replacing the SID in the exported reg key – this has not been tested but may be worth trying
*The user SID is unique so this has to be done per user. If there are a lot of users listed in the registry it is possible to find which SID belongs to which user by checking the key HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList

阅读您的编辑后,听起来这里有一些回旋的空间。 如果我们采取 2 个小自由,这可以在一个命令行中完成。 如果不能获得一项或两项自由,请告诉我。

如果不需要 WMIC,并且我们可以定位所有存在的 SID,而不是尝试将名称与 SID 匹配,则"reg.exe"和"for"可以快速执行此操作。 下面是一个包含示例输出的示例:

(可选)枚举配置文件:

cmd:
for /f "delims= tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @echo ;[i] Profile Found: {%A}
output:
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1001}
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1002}
;[i] Profile Found: {S-1-5-21-277974881-2357464463-7727422770-1007}

添加键+值

cmd:
for /f "delims= tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @(reg add "hku%ASoftwareMicrosoftTerminal Server ClientDefaultAddinsFooKey" /v FooName /t REG_SZ /d "C:foofilefoo.dll" /f >nul 2>&1 && (echo ;[i] Reg Key Added {%A}) || (echo ;[i] Reg Key Failed To Add {%A}))
output:
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1001}
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1002}
;[i] Reg Key Added {S-1-5-21-277974881-2357464463-7727422770-1007}

(可选)验证是否成功:

cmd:
for /f "delims= tokens=2" %A in ('reg query hku ^| findstr /i "S-1-5-21-" ^| findstr /v /i "_Classes"') do @(reg query "hku%ASoftwareMicrosoftTerminal Server ClientDefaultAddinsFooKey" /v FooName 2>nul || echo ;[e] Couldn't Find Key {%A})
output:
HKEY_USERSS-1-5-21-277974881-2357464463-7727422770-1001SoftwareMicrosoftTerminal Server ClientDefaultAddinsFooKey
FooName    REG_SZ    C:foofilefoo.dll

HKEY_USERSS-1-5-21-277974881-2357464463-7727422770-1002SoftwareMicrosoftTerminal Server ClientDefaultAddinsFooKey
FooName    REG_SZ    C:foofilefoo.dll

HKEY_USERSS-1-5-21-277974881-2357464463-7727422770-1007SoftwareMicrosoftTerminal Server ClientDefaultAddinsFooKey
FooName    REG_SZ    C:foofilefoo.dll

不确定我是否理解你的问题。我的第一条评论应该说得很清楚。 您需要使用FOR /F命令来捕获WMIC输出。 这是将 SID 分配给变量的唯一方法。

@echo off
REM Read file with user names
FOR /F "usebackq tokens=*" %%G in ("users.txt") do (
REM use user name to find SID
FOR /F "delims=" %%H IN ('"wmic useraccount where name='%%~G' get sid| findstr /vi "SID""') DO (
REM Strip trailing line with CR
FOR /F "delims= " %%I IN ("%%~H") DO (
REM %%I is now the SID of the USER
REG ADD "HKEY_USERS%%ISoftwareMicrosoftaddstuffhere" /f
REG ADD "HKEY_USERS%%ISoftwareMicrosoftaddstuffhere" /t REG_SZ /d "addstuffhere"" /f
)
)
)

最新更新