Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Запись в реестр пользователя от администратора (http://forum.oszone.net/showthread.php?t=348584)

Ins1der 19-04-2021 11:11 2956001

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

alpap 19-04-2021 13:25 2956008

Цитата:

Цитата Ins1der
индентификатор в переменную »

Код:

@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

Ins1der 19-04-2021 15:22 2956017

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

Iska 19-04-2021 16:45 2956026

Ins1der, а зачем нужен запуск от имени администратора, если Вы планируете осуществлять запись в раздел пользователя?

alpap 19-04-2021 17:13 2956029

Цитата:

Цитата Ins1der
но надо указывать имя пользователя %username% тут не пройдет »

поверьте, вам это точно не нужно.

Ins1der 19-04-2021 18:15 2956038

Дело в том, что помимо HKCU, так же присутствуют ключи HKLM, которые без прав администратора не работают

Iska 19-04-2021 22:12 2956045

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

Elven 20-04-2021 09:52 2956061

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

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

Ins1der 20-04-2021 10:45 2956065

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

Foreigner 20-04-2021 11:52 2956069

Цитата:

Цитата Ins1der
Есть ли какой-то способ вывести всех локальных пользователей и загнать их в переменные ? »

Код:

Get-LocalUser | Where { $_.Enabled } | Select-Object Name, SID
Но тут могут быть "подводные камни" в виде технических аккаунтов, например sshd

Ins1der 20-04-2021 14:32 2956080

Цитата:

Цитата Foreigner
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 2956081

Цитата:

Цитата Ins1der
Такое возможно ? »

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

Код:

$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 2956082

Цитата:

Цитата Foreigner
Возможно, но зачем? »

Я хотел в дальнейшем засунуть их в choice с возможностью выбора нужного.

Foreigner 20-04-2021 15:18 2956086

Цитата:

Цитата Ins1der
Я хотел в дальнейшем засунуть их в 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]



Время: 01:51.

Время: 01:51.
© OSzone.net 2001-