Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - перенос личных сертификатов КриптоПро

Ответить
Настройки темы
Любой язык - перенос личных сертификатов КриптоПро

Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 21:11, 13-03-2017

 

Ветеран


Contributor


Сообщения: 24481
Благодарности: 7115

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 07:11, 14-03-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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
Не хватает головы на скрипт ((

Отправлено: 10:31, 14-03-2017 | #3


Ветеран


Contributor


Сообщения: 24481
Благодарности: 7115

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:36, 14-03-2017 | #4


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:30, 14-03-2017 | #5


Ветеран


Contributor


Сообщения: 24481
Благодарности: 7115

Профиль | Отправить PM | Цитировать


Тогда попробуйте так:
Скрытый текст
Код: Выделить весь код
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 хотфиксы не нужны.

Последний раз редактировалось Iska, 14-03-2017 в 20:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:41, 14-03-2017 | #6


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: png error.png
(19.6 Kb, 8 просмотров)

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

Отправлено: 19:45, 14-03-2017 | #7


Ветеран


Contributor


Сообщения: 24481
Благодарности: 7115

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:19, 14-03-2017 | #8


Новый участник


Сообщения: 6
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:36, 14-03-2017 | #9


Ветеран


Contributor


Сообщения: 24481
Благодарности: 7115

Профиль | Отправить PM | Цитировать


Так, тут попутно выяснил вроде бы как можно ограниченно реализовать 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.

Отправлено: 09:03, 15-03-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - перенос личных сертификатов КриптоПро

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2012 R2 - Перенос сервера сертификатов на другой сервер с другим именем sacredboy Windows Server 2012/2012 R2 0 10-08-2016 08:10
2008 R2 - Настройка личных папок пользователей guff007 Windows Server 2008/2008 R2 9 13-06-2012 14:16
Доступ - Перенос сертификатов между пользователями mindguru Microsoft Windows 2000/XP 0 05-08-2011 14:42
Доступ - Скрытие личных данных пользователя reutovo Microsoft Windows 7 2 17-04-2011 12:01
Ошибка - Проблема с импортом личных сертификатов sat812 Microsoft Windows 2000/XP 1 31-01-2010 16:35




 
Переход