Показать полную графическую версию : перенос личных сертификатов КриптоПро
Здравствуйте уважаемые специалисты.
задумался над автоматизацией переноса личных сертификатов КриптоПро, либо на другой комп, либо на новую windows. Сейчас это приходится делать ручками так:
Выгружаем куст реестра на старой машине HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Settings (для x86) | HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Settings (для X64), затем на новой машине смотрим SID и через notepad++ производим поиск и замену старого SID на новый SID в этих файлах, после чего импортируем измененные файлы в реестр, все - сертификаты перенесены ))
Можно ли как-то автоматизировать поиск и замену SID в выгруженных файлах???
meir, Вы полагаете, у всех и каждого установлен Crypto Pro? И причём тут «куст реестра»?
Покажите образец содержимого HKLM\SOFTWARE\Crypto Pro\Settings, укажите про какой именно SID идёт речь, где именно смотрите SID на новой машине.
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
Не хватает головы на скрипт ((
И тот, и другой SID представляют собой SID текущего пользователя, так?
Да, текущего пользователя
Тогда попробуйте так:
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 хотфиксы не нужны.
Фантастика!! крутой код! подскажите когда запускаю с ключом /export выскакивает ошибка (прикладываю скрин)
Это строка:
If objSWbemObjectEx.GetStringValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Crypto Pro\Settings", "Version", strValue) = 0 Then
? Попробуйте запускать скрипт с административными привилегиями. Соврал, это я упрощал код и забыл кое-что удалить. Поправил код в предыдущем сообщении, попробуйте его теперь.
Невероятно!!!!! завтра проверю на рабочих, но на моем сработало!!!! Спасибо огромное, даже не верится)))
Так, тут попутно выяснил вроде бы как можно ограниченно реализовать 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.
:( Попробовал мой экспортированный файл закинуть скриптом на рабочий компьютер, он просто создал рядом ветку с моим SID, не понимаю смотрю код, круто реализованно - он рабочий, но почему-то не подменяет :not-me:
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.