Войти

Показать полную графическую версию : Запись в реестр пользователя от администратора


Ins1der
19-04-2021, 11:11
Добрый день. Решил написать небольшой батник, но столкнулся в проблемой.
Пользователь состоит в группе Пользователи. Запукает батник от имени Администратора.
Такого содержания "REG ADD HKEY_CURRENT_USER\Control Panel..." естественно значение записывается в ветку Администратора, а не Пользователя. Как реализовать через батник запись в нужный раздел именно пользователя? Вариант с HKLM не подойдет.
Есть способ работы через SID по пути "HCU\S-1-5-21-353...\Control Panel...", но опять же откуда батнику знать какой идентификатор у пользователя, если только заранее вручную не задать значение через переменную, а если машин много, то под каждого писать замучаюсь. Может как-то можно забить индентификатор в переменную автоматически ? Очень надо, выручайте.

alpap
19-04-2021, 13:25
индентификатор в переменную »

@echo off
for /f "tokens=2" %%a in ('WHOAMI /USER /FO LIST^|find /i "SID"') do echo %%a
pause

или

@echo off
for /f "delims=" %%a in ('"wmic useraccount where name="ТУТ ИМЯ ПОЛЬЗОВАТЕЛЯ" get SID /value|find "^=""') do set "%%a"
echo %SID%
pause

на PowerShell

$user = [System.Security.Principal.NTAccount]::New("ТУТ ИМЯ ПОЛЬЗОВАТЕЛЯ")
$SID = $user.Translate([System.Security.Principal.SecurityIdentifier])
$SID.Value

и еще есть вот такая удобная утилита: PSGetSid (https://docs.microsoft.com/ru-ru/sysinternals/downloads/psgetsid)

Ins1der
19-04-2021, 15:22
Спасибо за ответ! Первый вариант выдаёт SID администратора, второй через wmic интересный, но надо указывать имя пользователя %username% тут не пройдет, опять же из-за того что будет выводить "Администратор"

Iska
19-04-2021, 16:45
Ins1der, а зачем нужен запуск от имени администратора, если Вы планируете осуществлять запись в раздел пользователя?

alpap
19-04-2021, 17:13
но надо указывать имя пользователя %username% тут не пройдет »
поверьте, вам это точно не нужно.

Ins1der
19-04-2021, 18:15
Дело в том, что помимо HKCU, так же присутствуют ключи HKLM, которые без прав администратора не работают

Iska
19-04-2021, 22:12
Ins1der, так простой пользователь и не должен иметь возможности для записи в HKLM. Что-то не то с Вашим выбором алгоритма.

Elven
20-04-2021, 09:52
Странная какая-то проблема... Если есть какие-то параметры реестра которые должны задаваться от администратора И обычного пользователя, то проще нарисовать два батника (или скрипта на поше). Еще проще - задавать эти параметры через GPO. Как ядрёна смесь первого и второго варианта - два батника/скрипта, которые через созданные посредством GPO таски в шедулере стартуют каждый от своего пользователя (в этом случае рекомендую пользовать вместо учетки с правами админа - system).
Есть еще извращенные варианты с одним батником/скриптом - либо давать (а потом возвращать в то состояние в которое и было) права на нужную ветку в HKLM !(не рекомендуется аж вообще, одна кривая буковка и права потом замаешься восстанавливать)!, либо находить SID нужного пользователя и цепляться по нему в HKU (что было в одном из первых постов, но, как я понимаю, ломает вводить имя пользователя), альтернативой поиску конкретного пользователя является добавление/изменение ключа для ВСЕХ пользователей (что тоже не рекомендуется). Наконец можно составить список пользователей и сверять с ним наличествующих на каждой машине, если нашелся тот который нужно - добавить/изменить ключ по его SID (если пользователи доменные - в файле можно даже держать не имена их учеток, а сразу нужные SID).

Вроде это все варианты для решения задачи (коллеги, если упускаю какой - поправьте). Определитесь уже с каким помочь (ну или не помогать, часть вопросов, после правильной постановки оных - отваливаются).

Ins1der
20-04-2021, 10:45
У меня в скрипте так же выполняется работа с icacls и созданием файлов в системных директориях, потому я для себя вижу только вариант предложенный alpap через wmic, но опять же придется прописывать каждого пользователя. Есть ли какой-то способ вывести всех локальных пользователей и загнать их в переменные ?

Foreigner
20-04-2021, 11:52
Есть ли какой-то способ вывести всех локальных пользователей и загнать их в переменные ? »


Get-LocalUser | Where { $_.Enabled } | Select-Object Name, SID


Но тут могут быть "подводные камни" в виде технических аккаунтов, например sshd

Ins1der
20-04-2021, 14:32
Get-LocalUser | Where { $_.Enabled } | Select-Object Name, SID »
Я так понимаю это аналог "wmic useraccount where status="OK" get name, sid". Как-то можно тех что выдало в name занести в переменные %user1%, %user2% итд ? Такое возможно ?

Foreigner
20-04-2021, 14:44
Такое возможно ? »

Возможно, но зачем? Когда получаешь объект, то нет смысла его разбивать на переменные.


$users = Get-LocalUser | Where { $_.Enabled } | Select-Object Name, SID

foreach ($user in $users) {

"do something with $($user.name) and $($user.sid)"
}

# Или брать по индексу
$users[0].name
$users[1].sid.value

Ins1der
20-04-2021, 14:58
Возможно, но зачем? »
Я хотел в дальнейшем засунуть их в choice с возможностью выбора нужного.

Foreigner
20-04-2021, 15:18
Я хотел в дальнейшем засунуть их в choice »

choice это из прошлого. Меню выбора можно и без choice:


$users = Get-LocalUser | Where { $_.Enabled } | Select-Object Name, SID

1..$users.count | foreach { '{0,2}: {1}' -f $_,$users[$_-1].name }
$choice = [int](Read-Host "Выбери")

$users[$choice-1]




© OSzone.net 2001-2012