Войти

Показать полную графическую версию : перенос личных сертификатов КриптоПро


meir
13-03-2017, 21:11
Здравствуйте уважаемые специалисты.
задумался над автоматизацией переноса личных сертификатов КриптоПро, либо на другой комп, либо на новую 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
meir, Вы полагаете, у всех и каждого установлен Crypto Pro? И причём тут «куст реестра»?

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

meir
14-03-2017, 10:31
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
И тот, и другой SID представляют собой SID текущего пользователя, так?

meir
14-03-2017, 14:30
Да, текущего пользователя

Iska
14-03-2017, 18:41
Тогда попробуйте так:
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 (https://support.microsoft.com/en-us/help/948698/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
Фантастика!! крутой код! подскажите когда запускаю с ключом /export выскакивает ошибка (прикладываю скрин)

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

meir
14-03-2017, 20:36
Невероятно!!!!! завтра проверю на рабочих, но на моем сработало!!!! Спасибо огромное, даже не верится)))

Iska
15-03-2017, 09:03
Так, тут попутно выяснил вроде бы как можно ограниченно реализовать 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
:( Попробовал мой экспортированный файл закинуть скриптом на рабочий компьютер, он просто создал рядом ветку с моим SID, не понимаю смотрю код, круто реализованно - он рабочий, но почему-то не подменяет :not-me:

Iska
15-03-2017, 19:33
meir, покажите, как должно было быть, и как на самом деле получилось.

DmitriiV
23-03-2017, 07:45
... как можно ограниченно реализовать 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




© OSzone.net 2001-2012