使用Windows帐户列表使用SIDS添加注册表项

问题描述 投票:0回答:2

edit re explanation to improve answers.

项目

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

他们想要KEY的位置在reg中的HKEY_USERS路径中: -

HKEY_USERS \ S-1-5-21-XXXXXXXXX-XXXXXXXXX-XXXXXXXXXX-XXXXX \软件\微软\

所以假设有2人登录这台电脑,他们需要稍后使用我们的软件

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

谢谢 - 希望能真正解释它:/

edit instructions for what I have been asked to do (altered key names slightly for privacy)

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
batch-file wmic
2个回答
1
投票

看完你的编辑后,听起来好像有一些空间在这里摆动。如果我们采取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

0
投票

不确定我是否理解你的问题。我的第一个评论应该说得很清楚。您需要使用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
        )
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.