Показать полную графическую версию : Подмена строки из выполненной команды в текстовый файл
Имеется команда wmic useraccount where name='username' get sid | find /i "S-"
Требуется результатом команды подменить определенный текст в файле и после этого запустить файл с изменениями.
Текст в файлике примерно такой:
HKEY_CURRENT_USER\...
Необходимо заменить "HKEY_CURRENT_USER" на "HKEY_USERS\%результат выполнения комманды%\"
Посоветуйте как сделать это покрасивее.
определенный текст в файле и после этого запустить файл с изменениями »
Файл — есть файл реестра?
Так и есть, 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, но это я уже подпилю.
reg-файл с ключами реестра »
1. В какой кодировке файл реестра?
2. Его содержимое заранее известно?
3. Устроит ли Вас WSH-скрипт?
1. UTF-8
2. Содержание известно, единственно что изменяется это путь до ветки реестра, на каждом ПК он разный. В файлике он представлен в виде "HKEY_CURRENT_USER\software\microsoft\windows...", а необходимо чтобы выглядел "HKEY_USERS\%результат_выполнения_команды%\software\microsoft\windows..."
3. Устроит любое элегантное решение в котором будут сведены к минимуму вмешательства пользователя.
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. Какова Ваша конечная цель всего действа?
Насчет кодировки мог и ошибиться, прошу прощения.
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
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%\....
Если скрипт выполнять из под УЗ администратора на Вин7, то он выходит с ошибкой "Параметр задан неверно", а если из под пользователя которому надо произвести изменения, но через runas /u:Администратор, то нормально. В чем может быть дело?
Если скрипт выполнять »
Какой именно из нескольких, приведённых выше?
Последний.
@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ке, получил ошибку, не пойму в чем дело
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.