Компьютерный форум 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=228532)

Jeander 22-02-2012 16:22 1864436

Подмена строки из выполненной команды в текстовый файл
 
Имеется команда
Код:

wmic useraccount where name='username' get sid | find /i "S-"
Требуется результатом команды подменить определенный текст в файле и после этого запустить файл с изменениями.
Текст в файлике примерно такой:
Код:

HKEY_CURRENT_USER\...
Необходимо заменить
Код:

"HKEY_CURRENT_USER"
на
Код:

"HKEY_USERS\%результат выполнения комманды%\"
Посоветуйте как сделать это покрасивее.

Iska 22-02-2012 19:02 1864550

Цитата:

Цитата Jeander
определенный текст в файле и после этого запустить файл с изменениями »

Файл — есть файл реестра?

Jeander 23-02-2012 19:42 1865329

Так и есть, reg-файл с ключами реестра, в нём прописан путь до ветки куда нужно добавить ключ, ветка на каждом ПК разная, путь до ветки можно узнать выполняя комманду
Код:

wmic useraccount where name='username' get sid | find /i "S-"
То есть примерный скрипт выглядит так:
Код:

wmic useraccount where name='username' get sid | find /i "S-"
;код который заменяет текст в файле reg_file.reg
;HKEY_CURRENT_USER\software\microsoft\windows...
;на
;HKEY_USERS\%результат_выполнения_команды%\software\microsoft\windows...
REGEDIT /S reg_file.reg

было бы классно обойтись одним исполняемым файлом + reg-файл, или совсем идеальный вариант используя команду REG, но это я уже подпилю.

Iska 23-02-2012 22:53 1865419

Цитата:

Цитата Jeander
reg-файл с ключами реестра »

1. В какой кодировке файл реестра?
2. Его содержимое заранее известно?
3. Устроит ли Вас WSH-скрипт?

Jeander 24-02-2012 12:04 1865605

1. UTF-8
2. Содержание известно, единственно что изменяется это путь до ветки реестра, на каждом ПК он разный. В файлике он представлен в виде "HKEY_CURRENT_USER\software\microsoft\windows...", а необходимо чтобы выглядел "HKEY_USERS\%результат_выполнения_команды%\software\microsoft\windows..."
3. Устроит любое элегантное решение в котором будут сведены к минимуму вмешательства пользователя.

Iska 24-02-2012 18:13 1865847

Цитата:

Цитата Jeander
1. UTF-8 »

Скорее UTF-16LE. В UTF-8 ни разу не приходилось встречать файлы реестра.

Как-то так:
читать дальше »
Код:

Option Explicit

Const ForReading  = 1
Const ForWriting  = 2
Const TristateTrue = -1

Dim strSID
Dim strContent
Dim strTempFile

strSID = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2" _
        ).Get("Win32_UserAccount.Domain='DomainOrMachineName',Name='UserName'").SID

With WScript.CreateObject("Scripting.FileSystemObject")
        With .OpenTextFile("C:\Песочница\0002\Console2.reg", ForReading, False, TristateTrue)
                strContent = .ReadAll()
                .Close
        End With
       
        strTempFile = GetTemporaryName()
       
        With .OpenTextFile(strTempFile, ForWriting, True, TristateTrue)
                .Write Replace(strContent, "HKEY_CURRENT_USER", "HKEY_USERS\" & strSID)
                .Close
        End With
       
        With WScript.CreateObject("WScript.Shell")
                .Run "regedit.exe /s """ & strTempFile & """", 0, True
        End With
       
        .DeleteFile strTempFile, True
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
    Const TemporaryFolder = 2
   
    Dim strTempName
   
    With WScript.CreateObject("Scripting.FileSystemObject")
        Do
            strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
        Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
    End With
   
    GetTemporaryName = strTempName
End Function
'=============================================================================


1. Откуда Вы будете брать «Domain\UserName»?
2. Какова Ваша конечная цель всего действа?

Jeander 24-02-2012 21:07 1865942

Насчет кодировки мог и ошибиться, прошу прощения.

1. UserName можно подставить один раз вручную, он на всех машинах одинаковый. Есть ли возможность обойтись без DomainOrMachineName, так как машины не в домене и имя ПК абсолютно уникально, менять каждый раз ручками не получится.

2. На N-количестве машин с одинаковыми именами пользователя %username%, но с ограниченными правами необходимо поменять определенные ключи реестра. Если точнее, то это настройки безопасности в IE7-8. Естественно reg-файл будет запускаться с правами администратора, но у администратора HKEY_CURRENT_USER отличается от такой же ветки у %username%. Следовательно необходимо сделать записи в зеркало ветки %username% в HKEY_USERS, но пользователи там имеют идентификатор SID(security ID), который уникален на каждой машине. Я выяснил, что SID на любой машине у пользователя %username% можно узнать используя
Код:

wmic useraccount where name='username' get sid | find /i "S-"
но как подставить это значение в путь в reg-файлике без участия пользователя я к сожалению не знаю.

Foreigner 25-02-2012 16:33 1866320

Jeander,

Так может вообще обойтись без reg-файла? Как пример:
Код:

@echo off
setlocal

set "wmic=wmic useraccount where name="%username%" get sid /value"

for /f %%i in (' "%wmic%" ') do 1>nul set "%%i"

echo %sid%

:: И дальше заносим нужные ключи в реестр

reg add \\remote_comp\hku\%sid%\....


Jeander 27-02-2012 11:44 1867530

То что нужно, спасибо!

Jeander 19-04-2012 11:44 1902391

Если скрипт выполнять из под УЗ администратора на Вин7, то он выходит с ошибкой "Параметр задан неверно", а если из под пользователя которому надо произвести изменения, но через runas /u:Администратор, то нормально. В чем может быть дело?

Iska 19-04-2012 13:48 1902461

Цитата:

Цитата Jeander
Если скрипт выполнять »

Какой именно из нескольких, приведённых выше?

Jeander 19-04-2012 14:32 1902503

Последний.
Код:

@echo off
setlocal

set "wmic=wmic useraccount where name="%username%" get sid /value"

for /f %%i in (' "%wmic%" ') do 1>nul set "%%i"

echo %sid%

:: И дальше заносим нужные ключи в реестр

reg add \\remote_comp\hku\%sid%\....

На WinXP работает как часы, начал на 7ке, получил ошибку, не пойму в чем дело


Время: 08:26.

Время: 08:26.
© OSzone.net 2001-