使用 List of Windows accounts 添加 reg keys using SIDS
Use List of Windows accounts to add reg keys using SIDS
编辑重新解释以改进答案。
项目
作为第三方工程师,我正在访问一个站点以安装软件。基础设施“非常”锁定。我将获得当天的管理员帐户来安装软件。但是,为了使软件对所有用户(不仅仅是管理员登录)正常工作,IT 部门已指示我。手动创建一个 KEY,然后在为 PC 上的每个用户帐户创建的密钥中添加一个字符串值。我们在标准环境中的软件通过所有用户注册密钥满足此要求,但在这些特定位置 运行(不允许 - 不要问!)。
他们想要 KEY 的位置在 reg:-
中的 HKEY_USERS 路径内
HKEY_USERS\S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX-XXXXX\Software\Microsoft\
假设有 2 个人登录了这台 PC,他们稍后需要使用我们的软件
john.jones
mary.shelley
我需要找到与 john jones 相关的 sid,然后将密钥添加到他在 HKEY_USERS
中的部分
然后我需要找到 mary.shelley sid,然后找到她 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\%%I\Software\Microsoft\addstuffhere" /f
REG ADD "HKEY_USERS\%%I\Software\Microsoft\addstuffhere" /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 上的东西”并制作 users.txt
谢谢 - 希望能真正解释它:/
编辑我被要求做的事情的说明(为了隐私略微更改了密钥名称)
1. Log on to the PC with a standard technician admin account
2. Open regedit.exe
3. Navigate to* HKEY_USERS\S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX- XXXXX\Software\Microsoft\Terminal Server Client\Default\Addins\
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:\foo\file\foo.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_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
不确定我是否理解你的问题。我的第一条评论应该已经说得很清楚了。您需要使用 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\%%I\Software\Microsoft\addstuffhere" /f
REG ADD "HKEY_USERS\%%I\Software\Microsoft\addstuffhere" /t REG_SZ /d "addstuffhere"" /f
)
)
)
阅读您的编辑后,听起来这里还有一些调整的余地。如果我们采取 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\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName /t REG_SZ /d "C:\foo\file\foo.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\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName 2>nul || echo ;[e] Couldn't Find Key {%A})
output:
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1001\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1002\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1007\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll
编辑重新解释以改进答案。
项目
作为第三方工程师,我正在访问一个站点以安装软件。基础设施“非常”锁定。我将获得当天的管理员帐户来安装软件。但是,为了使软件对所有用户(不仅仅是管理员登录)正常工作,IT 部门已指示我。手动创建一个 KEY,然后在为 PC 上的每个用户帐户创建的密钥中添加一个字符串值。我们在标准环境中的软件通过所有用户注册密钥满足此要求,但在这些特定位置 运行(不允许 - 不要问!)。
他们想要 KEY 的位置在 reg:-
中的 HKEY_USERS 路径内HKEY_USERS\S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX-XXXXX\Software\Microsoft\
假设有 2 个人登录了这台 PC,他们稍后需要使用我们的软件
john.jones
mary.shelley
我需要找到与 john jones 相关的 sid,然后将密钥添加到他在 HKEY_USERS
中的部分然后我需要找到 mary.shelley sid,然后找到她 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\%%I\Software\Microsoft\addstuffhere" /f
REG ADD "HKEY_USERS\%%I\Software\Microsoft\addstuffhere" /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 上的东西”并制作 users.txt
谢谢 - 希望能真正解释它:/
编辑我被要求做的事情的说明(为了隐私略微更改了密钥名称)
1. Log on to the PC with a standard technician admin account
2. Open regedit.exe
3. Navigate to* HKEY_USERS\S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX- XXXXX\Software\Microsoft\Terminal Server Client\Default\Addins\
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:\foo\file\foo.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_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
不确定我是否理解你的问题。我的第一条评论应该已经说得很清楚了。您需要使用 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\%%I\Software\Microsoft\addstuffhere" /f
REG ADD "HKEY_USERS\%%I\Software\Microsoft\addstuffhere" /t REG_SZ /d "addstuffhere"" /f
)
)
)
阅读您的编辑后,听起来这里还有一些调整的余地。如果我们采取 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\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName /t REG_SZ /d "C:\foo\file\foo.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\%A\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey" /v FooName 2>nul || echo ;[e] Couldn't Find Key {%A})
output:
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1001\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1002\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll
HKEY_USERS\S-1-5-21-277974881-2357464463-7727422770-1007\Software\Microsoft\Terminal Server Client\Default\Addins\FooKey
FooName REG_SZ C:\foo\file\foo.dll