1

Тема: VBA: работа с файлом реестра

Добрый день . Устанавливаем на предприятии Автокад 2010 и его разновидности ( Механикал и Электрикал ) , поставить с помощью групповой политики и System Center , не представляется возможным из за кривости ЛИЦЕНЗИОННОГО дистрибутива . Требуется установить на 400 машин , так что в ручную в одно лицо ставить не очень приятно . В результате было принято решение ставить через антивирус Касперского с помощью встроенного в него распространителя собственных обновлений , и вуаля всё получилось и Автокад установлен . Теперь надо исправить парочку файлов реестра и можно трудиться . Решено было написать 2 скрипта и инструкцию пользователям для первоначальной настройки . Первый скрипт заменяет в файле реестра "userNNNNN" на "user(его порядковый номер ) казалось бы элементарно но упорно не получается .

Есть файл реестра: HK_CU_ACAD_EL_userNNNNN он лежит в D:\User_ws\
к нему применяется скрипт

Const OverwriteExisting = True
regfn="HK_CU_ACAD_EL_userNNNNN.reg"


Set WshShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")

tempFolder=WshShell.ExpandEnvironmentStrings("%Temp%")
tempFolder=tempFolder & "\"
'wscript.echo tempFolder

userprof=WshShell.ExpandEnvironmentStrings("%userprofile%")
'wscript.echo userprof

targetFolder=WshShell.ExpandEnvironmentStrings("%APPDATA%") & "\Autodesk\AutoCAD Mechanical 2010\"
'wscript.echo targetFolder


If (objFSO.FolderExists(targetFolder)) Then
objFSO.CopyFile "D:\User_ws\" & regfn, tempFolder , OverwriteExisting

Const ForReading = 1
Const ForWriting = 2

reg_filename=tempFolder & regfn
reg_in="D:\\Documents and Settings\\userNNNNN"
reg_out=Replace(userprof,"\","\\")
'wscript.echo reg_in
'wscript.echo reg_out

Set objFile = objFSO.OpenTextFile(reg_filename, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, reg_in, reg_out)

Set objFile = objFSO.OpenTextFile(reg_filename, ForWriting)
objFile.WriteLine strNewText
objFile.Close

'txtComm="regedit """ & reg_filename & """"
'WScript.Echo txtComm
'Return = WshShell.Run(txtComm, 1, true)
'WScript.Echo Return
'objFSO.DeleteFile(reg_filename)

Скрипт анологичен скрипту который писался ранее для АВТОКАДА 2006 , там всё работает на ура .
в результате получается файл реестра который лежит в  D:\Temp\  , но не корректный . но на исходный он совсем не похож

http://s50.radikal.ru/i128/1010/29/5755b2aeb31e.jpg

подскажите ламеру , не хочу ко всем машинам лично цепляться и за них это всё делать ....)

2

Re: VBA: работа с файлом реестра

файлик исходный в уникоде
либо экспортируйте из реестра в регедит4 либо и работайте в юникоде

Я конечно далек от мысли... (с)

3

Re: VBA: работа с файлом реестра

а можно эту же фразу в варианте для чайников )

4

Re: VBA: работа с файлом реестра

выложите исходный файл

а так когда экспортировали файл реестра надо было выбрать тип REGEDIT4

Я конечно далек от мысли... (с)

5

Re: VBA: работа с файлом реестра

исходный файл длиннее максимально разрешённого сообщения , так что выложить тоже проблема ...
но он действительно в уникоде....
сейчас буду пробовать экспортировать регедит4 , спасибо

6

Re: VBA: работа с файлом реестра

Абрахамс, ёлы-палы, Shift почини, а?

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

7

Re: VBA: работа с файлом реестра

Да ладно ))) у меня 4 системы запущено на одном и есть некоторые проблемы с раскладками

Я конечно далек от мысли... (с)

8

Re: VBA: работа с файлом реестра

спасибо , разобрался .

9

Re: VBA: работа с файлом реестра

Встал вопрос проверки существования ключа реестра .
Поиск по данному форуму и в технете не помог , выручайте Коллеги .

10

Re: VBA: работа с файлом реестра

Что именно Вы хотите сделать затем?

11

Re: VBA: работа с файлом реестра

хочу чтобы скрипт выполнялся только в том случае , если в реестре ость определённый ключ

12

Re: VBA: работа с файлом реестра

Например, так:

Option Explicit

Const HKEY_LOCAL_MACHINE = &H80000002

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx

Dim arrNames
Dim arrTypes
Dim elem

Dim strParameter
Dim boolFound


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\default")
Set objSWbemObjectEx   = objSWbemServicesEx.Get("StdRegProv")

strParameter = "nwiz"

If objSWbemObjectEx.EnumValues(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\Run", arrNames, arrTypes) = 0 Then
    boolFound = False
    
    If IsArray(arrNames) Then
        For Each elem In arrNames
            If elem = strParameter Then
                boolFound = True
                
                Exit For
            End If
        Next
    End If
    
    If boolFound Then
        WScript.Echo "Parameter [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\" & strParameter & "] found"
    Else
        WScript.Echo "Parameter [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\" & strParameter & "] not found"
    End If
Else
    WScript.Echo "Can't enumerate parameters in registry key [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]"
End If

Set objSWbemObjectEx   = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Здесь ищем параметр «nwiz» в разделе «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run».