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

meir 13-03-2017 21:11 2719115

перенос личных сертификатов КриптоПро
 
Здравствуйте уважаемые специалисты.
задумался над автоматизацией переноса личных сертификатов КриптоПро, либо на другой комп, либо на новую windows. Сейчас это приходится делать ручками так:
Выгружаем куст реестра на старой машине HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings (для x86) | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings (для X64), затем на новой машине смотрим SID и через notepad++ производим поиск и замену старого SID на новый SID в этих файлах, после чего импортируем измененные файлы в реестр, все - сертификаты перенесены ))
Можно ли как-то автоматизировать поиск и замену SID в выгруженных файлах???

Iska 14-03-2017 07:11 2719197

meir, Вы полагаете, у всех и каждого установлен Crypto Pro? И причём тут «куст реестра»?

Покажите образец содержимого HKLM\SOFTWARE\Crypto Pro\Settings, укажите про какой именно SID идёт речь, где именно смотрите SID на новой машине.

meir 14-03-2017 10:31 2719246

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings]
"Version"="4.0.9708"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\KeyDevices]
"LicErrorLevel"=dword:00000006

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Keys]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Users]
@=""

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Users\S-1-5-21-1365644562-2568224515-950490703-1000]

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings\Users\S-1-5-21-1365644562-2568224515-950490703-1000\KeyDevices]

На старом компе я вижу установленные Контур, Сбис и другие установленные программы использующие шифрование КриптоПро, экспортирую ключ реестра (выше приведено начало ключа sid в данном случае S-1-5-21-1365644562-2568224515-950490703-1000) На новом компе первым делом я устанавливаю криптоПро, затем получаю SID напирмер он S-1-5-21-1365644562-2568224515-950490703-2222 и через notepad ++ заменяю sid, затем импортирую получившийся файл. Загвоздка тока в замене sid, пытался сделать так: получаем sid в текстовый файл командой wmic useraccount where name='%username%' get sid > C:\sid\oldPK.txt , так же на новом wmic useraccount where name='%username%' get sid > C:\sid\newPK.txt , получается значение из двух строчек
SID
S-1-5-21-1365644562-2568224515-950490703-1000
искать значение 2й строки из oldPK.txt в файле key.reg и заменить его значением из 2й строки файла newPK.txt
Не хватает головы на скрипт ((

Iska 14-03-2017 12:36 2719296

И тот, и другой SID представляют собой SID текущего пользователя, так?

meir 14-03-2017 14:30 2719338

Да, текущего пользователя

Iska 14-03-2017 18:41 2719452

Тогда попробуйте так:
Скрытый текст
Код:

Option Explicit

Const strExportedCryptoProFile = "Exported Crypto Pro.reg"
Const strReplacePatternForCurrentUserSID = "@@@CurrentUserSID@@@"

Const HKEY_LOCAL_MACHINE = &H80000002

Const ForReading  = 1
Const TristateTrue = -1

Const SystemFolder = 1


Dim objSWbemLocator

Dim objFSO
Dim strContent

Dim strValue

Dim strCurrentUserSID


If WScript.Arguments.Count = 1 Then
        Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
        Set objFSO          = WScript.CreateObject("Scripting.FileSystemObject")
       
        Select Case LCase(WScript.Arguments.Item(0))
                Case "/export"
                        With objSWbemLocator.ConnectServer(".", "root\default").Get("StdRegProv")
                                If .GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Crypto Pro\Settings", "Version", strValue) = 0 Then
                                        WScript.CreateObject("WScript.Shell").Run """reg.exe"" export ""HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro"" """ & strExportedCryptoProFile & """ /y", 0, True
                                ElseIf .GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Wow6432Node\Crypto Pro\Settings", "Version", strValue) = 0 Then
                                        WScript.CreateObject("WScript.Shell").Run """reg.exe"" export ""HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro"" """ & strExportedCryptoProFile & """ /y /reg:32", 0, True
                                Else
                                        WScript.Echo "Can't find [Crypto Pro] subkey in registry."
                                        WScript.Quit 2
                                End If
                        End With
                       
                        With WScript.CreateObject("WinNTSystemInfo")
                                strCurrentUserSID = objSWbemLocator.ConnectServer(".", "root\cimv2").Get("Win32_UserAccount.Domain='" & .DomainName & "',Name='" & .UserName & "'").SID
                        End With
                       
                        With objFSO.OpenTextFile(strExportedCryptoProFile, ForReading, False, TristateTrue)
                                strContent = Replace(.ReadAll(), strCurrentUserSID, strReplacePatternForCurrentUserSID)
                                .Close
                        End With
                       
                        With objFSO.CreateTextFile(strExportedCryptoProFile, True, True)
                                .Write strContent
                                .Close
                        End With
                Case "/import"
                        If objFSO.FileExists(strExportedCryptoProFile) Then
                                With WScript.CreateObject("WinNTSystemInfo")
                                        strCurrentUserSID = objSWbemLocator.ConnectServer(".", "root\cimv2").Get("Win32_UserAccount.Domain='" & .DomainName & "',Name='" & .UserName & "'").SID
                                End With
                               
                                With objFSO.OpenTextFile(strExportedCryptoProFile, ForReading, False, TristateTrue)
                                        strContent = Replace(.ReadAll(), strReplacePatternForCurrentUserSID, strCurrentUserSID)
                                        .Close
                                End With
                               
                                With objFSO.CreateTextFile(strExportedCryptoProFile, True, True)
                                        .Write strContent
                                        .Close
                                End With
                               
                                WScript.CreateObject("WScript.Shell").Run """reg.exe"" import """ & strExportedCryptoProFile & """ /reg:32", 0, True
                        Else
                                WScript.Echo "Can't find exported Crypto Pro file [" & strExportedCryptoProFile & "]."
                                WScript.Quit 3
                        End If
                Case Else
                        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ /export|/import"
                        WScript.Quit 1
        End Select
       
        Set objFSO          = Nothing
        Set objSWbemLocator = Nothing
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ /export|/import"
        WScript.Quit 1
End If

WScript.Quit 0


Для экспорта запускаете скрипт с параметром «/export», для импорта — «/import». При экспорте производится экспорт раздела «HKLM\SOFTWARE\Crypto Pro» утилитой reg.exe в определённое в скрипте имя файла реестра — «Exported Crypto Pro.reg», затем в полученном файле реестра SID текущего пользователя заменяется на определённое в скрипте заданное значение — «@@@CurrentUserSID@@@». При импорте сначала производится замена в файле реестра строки с заданным в скрипте значением на SID текущего пользователя, затем производится импорт данного файла реестра той же утилитой reg.exe.

Для версий ОС от Windows XP/Windows Server 2003 и до Vista/Windows Server 2008 могут потребоваться хотфиксы: You cannot use the Reg.exe utility to access 64-bit registry keys on a 64-bit computer from a computer that is running a 32-bit version of Windows Server 2003, Windows XP, Windows Server 2008, or Windows Vista. Начиная с Windows 7/Windows Server 2008 R2 хотфиксы не нужны.

meir 14-03-2017 19:45 2719477

Вложений: 1
Фантастика!! крутой код! подскажите когда запускаю с ключом /export выскакивает ошибка (прикладываю скрин)

Iska 14-03-2017 20:19 2719485

Это строка:
Код:

If objSWbemObjectEx.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Crypto Pro\Settings", "Version", strValue) = 0 Then
? Попробуйте запускать скрипт с административными привилегиями. Соврал, это я упрощал код и забыл кое-что удалить. Поправил код в предыдущем сообщении, попробуйте его теперь.

meir 14-03-2017 20:36 2719492

Невероятно!!!!! завтра проверю на рабочих, но на моем сработало!!!! Спасибо огромное, даже не верится)))

Iska 15-03-2017 09:03 2719621

Так, тут попутно выяснил вроде бы как можно ограниченно реализовать IsWow64Process на WSH :), оставлю для себя для памяти на будущее:
Скрытый текст
Код:

Option Explicit

Dim objSWbemObjectEx


For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").InstancesOf("Win32_Process")
        With objSWbemObjectEx
                WScript.Echo Left(.Name & Space(24), 24), Right(Space(12) & CStr(.ProcessID), 12), Array("32-bit", "64-bit")(CInt(IsWow64Process(.ProcessID)) + 1)
        End With
Next

WScript.Quit 0

Function IsWow64Process(lngProcessID)
        Const SystemFolder = 1
       
        Dim objSWbemObjectEx
       
        IsWow64Process = False
       
        For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").Get("Win32_Process.Handle='" & CStr(lngProcessID) & "'").Associators_(, "CIM_DataFile")
                With WScript.CreateObject("Scripting.FileSystemObject")
                        If StrComp(.BuildPath(.GetSpecialFolder(SystemFolder), "wow64.dll"), objSWbemObjectEx.Name, vbTextCompare) = 0 Then
                                IsWow64Process = True
                               
                                Exit Function
                        End If
                End With
        Next
End Function


Понятно, что это ни разу не натуральная IsWow64Process и близко. Просто тупо смотрим — есть ли у заданного процесса библиотека %SystemRoot%\System32\wow64.dll. Если есть — с некоторой долей вероятности это x86 процесс под x64 ОС. Разумеется, подобный упрощённый подход чреват ошибками, скажем, дочерний procexp64.exe (являющийся вполне себе x64) будет некорректно определён как x86.

meir 15-03-2017 11:11 2719653

:( Попробовал мой экспортированный файл закинуть скриптом на рабочий компьютер, он просто создал рядом ветку с моим SID, не понимаю смотрю код, круто реализованно - он рабочий, но почему-то не подменяет :not-me:

Iska 15-03-2017 19:33 2719767

meir, покажите, как должно было быть, и как на самом деле получилось.

DmitriiV 23-03-2017 07:45 2722310

Цитата:

Цитата Iska
... как можно ограниченно реализовать IsWow64Process на WSH...»

А такой вариант?
Код:

Set objWShell = CreateObject("WScript.Shell")
strPA = UCase(objWShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%"))
strPA6432 = UCase(objWShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%"))
If strPA = "X86" And strPA6432 = "%PROCESSOR_ARCHITEW6432%" Then
        WScript.Echo "32-разрядная ОС"
ElseIf strPA = "X86" And Right(strPA6432, 2) = "64" Then
        WScript.Echo "32-разрядный процесс в 64-разрядной ОС"
Else
        WScript.Echo "64-разрядная ОС"
End If



Время: 21:53.

Время: 21:53.
© OSzone.net 2001-