├── .idea ├── compiler.xml ├── description.html ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── uiDesigner.xml └── vcs.xml ├── LicDataExtractor.iml ├── README.md ├── src └── sample │ ├── Extractor.java │ ├── Main.java │ └── RegDataWriter.java └── Достаем информацию из файла лицензии 1С.docx /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.idea/description.html: -------------------------------------------------------------------------------- 1 | Simple JavaFX 2.0 application that includes simple .fxml file with attached controller and Main class to quick start. Artifact to build JavaFX application is provided. 2 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LicDataExtractor.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LicDataExtractor 2 | 3 | Извлечение регистрационных данных клиента из файла программной лицензии 1С Предприятия. 4 | 5 | Утилита пишется по просьбе коллег. 6 | 7 | Назначение: извлечение регистрационных данных клиента из файла программной лицензии системы 1С Предприятия. 8 | 9 | Технология: Java, JavaFX. 10 | 11 | Описание механизма получения данных: http://gogprog.ru/rabota_s_licenziyami_i_klyuchami_1s/license-info-1c.html 12 | 13 | По сути, используется консольная утилита ring, распространяемая в составе дистрибутива платформы 1С: Предприятие. 14 | 15 | LicDataExtractor служит лишь оберткой над этой утилитой, добавляя следующие удобства: 16 | 17 | - нет необходимости использовать командную строку для получения данных; 18 | - регистрационные данные, извлеченные из файла лицензии, показываются в окне на экране, откуда могут быть скопированы; 19 | - регистрационные данные также сохраняются в текстовый файл рядом с файлом лицензии. 20 | 21 | Системные требования и ограничения: 22 | 23 | - для работы утилиты необходим установленный JRE 1.8 или выше. 24 | - рекомендуется создать временную папку, куда нужно скопировать исследуемый файл лицензии. В папке одновременно может находиться только 25 | один файл лицензии. Возможно, в будущем это ограничение будет устранено, но пока так. 26 | 27 | Замеченные проблемы: 28 | 29 | - путь к папке не должен содержать пробелов. Если путь содержит пробелы, LicDataExtractor выведет ошибку, хотя сам файл лицензии корректен. Будет исправлено в следующих релизах. 30 | 31 | Подготовка к работе: 32 | 33 | - выполнить инструкции из статьи http://gogprog.ru/rabota_s_licenziyami_i_klyuchami_1s/license-info-1c.html (шаги 1-4); 34 | - создать временные папки на диске, куда скопировать файлы программных лицензий. В каждой папке должен быть один файл лицензии. 35 | - запустить LicDataExtractor, нажать на кнопку выбора директории и выбрать папку со скопированным файлом лицензии. 36 | 37 | Статус: релиз 1.02. 38 | 39 | Отказ от ответственности: утилита предоставляется "как есть", автор не несет ответственности за любые проблемы, связанные 40 | с ее использованием. Хотя и не может такие проблемы себе представить. 41 | 42 | Утилита разрабатывается в свободное время, любые замечания и пожелания будут с вниманием/благодарностью выслушаны/прочитаны, 43 | но не факт, что к чему-то приведут. 44 | 45 | Замечания и пожелания пишите на адрес: miller777@mail.ru 46 | 47 | Downloads: https://github.com/miller7777777/LicDataExtractor/releases/latest 48 | -------------------------------------------------------------------------------- /src/sample/Extractor.java: -------------------------------------------------------------------------------- 1 | package sample; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.File; 5 | import java.io.IOException; 6 | import java.io.InputStreamReader; 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | public class Extractor { 11 | 12 | private String fullDirectoryName; 13 | private String pinCode = null; 14 | private String regNumber = null; 15 | private String result; 16 | private String licFileName; 17 | private List regDataList = new ArrayList(); 18 | 19 | 20 | public Extractor(String fullDirectoryName) { 21 | this.fullDirectoryName = fullDirectoryName; 22 | extract(fullDirectoryName); 23 | } 24 | 25 | private void extract(String fullDirectoryName) { 26 | 27 | List results = new ArrayList(); 28 | File folder = new File(fullDirectoryName); 29 | File[] listOfFiles = folder.listFiles(); 30 | 31 | for (File file : listOfFiles) { 32 | if (file.isFile() && file.getName().endsWith(".lic")) { 33 | (results).add(file.getName()); 34 | } 35 | } 36 | 37 | switch (results.size()) { 38 | case 0: 39 | result = "В директории отсутствуют файлы программных лицензий."; 40 | break; 41 | case 1: 42 | licFileName = results.get(0); 43 | extract(fullDirectoryName, results); 44 | break; 45 | default: 46 | result = "В директории должен быть только один файл \nпрограммной лицензии. \n\nОбнаружено файлов программных лицензий: " + results.size(); 47 | break; 48 | } 49 | } 50 | 51 | private void extract(String fullDirectoryName, List results) { 52 | 53 | getPinRegNumber(fullDirectoryName, licFileName); 54 | getRegDataInfo(fullDirectoryName, pinCode, regNumber); 55 | } 56 | 57 | private void getRegDataInfo(String fullDirectoryName, String pinCode, String regNumber) { 58 | 59 | try { 60 | String argument = "ring.cmd license info --name " + pinCode + "-" + regNumber + " --path " + fullDirectoryName; 61 | 62 | Process proc = Runtime.getRuntime().exec(argument); 63 | BufferedReader stdInput = new BufferedReader(new 64 | InputStreamReader(proc.getInputStream(), "windows-1251")); 65 | 66 | BufferedReader stdError = new BufferedReader(new 67 | InputStreamReader(proc.getErrorStream())); 68 | 69 | // read the output from the command 70 | System.out.println("Here is the standard output of the command:\n"); 71 | 72 | String s = null; 73 | while ((s = stdInput.readLine()) != null) { 74 | System.out.println(s); 75 | regDataList.add(s); 76 | 77 | } 78 | 79 | // read any errors from the attempted command 80 | System.out.println("Here is the standard error of the command (if any):\n"); 81 | while ((s = stdError.readLine()) != null) { 82 | System.out.println(s); 83 | } 84 | 85 | proc.waitFor(); 86 | proc.destroy(); 87 | 88 | } catch (Exception e) { 89 | e.printStackTrace(); 90 | } 91 | 92 | formResult(); 93 | } 94 | 95 | private void getPinRegNumber(String fullDirectoryName, String licFileName) { 96 | try { 97 | String argument = "ring.cmd license list --path " + fullDirectoryName; 98 | 99 | Process proc = Runtime.getRuntime().exec(argument); 100 | BufferedReader stdInput = new BufferedReader(new 101 | InputStreamReader(proc.getInputStream())); 102 | 103 | BufferedReader stdError = new BufferedReader(new 104 | InputStreamReader(proc.getErrorStream())); 105 | 106 | // read the output from the command 107 | System.out.println("Here is the standard output of the command:\n"); 108 | String s = null; 109 | if ((s = stdInput.readLine()) != null) { 110 | System.out.println(s); 111 | String pinReg[] = s.split("-"); 112 | pinCode = pinReg[0]; 113 | regNumber = pinReg[1]; 114 | } 115 | 116 | // read any errors from the attempted command 117 | System.out.println("Here is the standard error of the command (if any):\n"); 118 | while ((s = stdError.readLine()) != null) { 119 | System.out.println(s); 120 | } 121 | 122 | proc.waitFor(); 123 | proc.destroy(); 124 | } catch (IOException e) { 125 | e.printStackTrace(); 126 | } catch (InterruptedException e) { 127 | e.printStackTrace(); 128 | } 129 | 130 | } 131 | 132 | private void formResult() { 133 | StringBuilder sb = new StringBuilder(); 134 | sb.append("Файл: " + licFileName + "\r\n"); 135 | sb.append("Пин-код: " + pinCode + "\r\n"); 136 | sb.append("Рег.номер: " + regNumber + "\r\n"); 137 | 138 | for (int i = 0; i < regDataList.size(); i++) { 139 | sb.append(regDataList.get(i) + "\r\n"); 140 | } 141 | result = sb.toString(); 142 | } 143 | 144 | public String getResult() { 145 | 146 | return result; 147 | } 148 | 149 | public String getLicFileName() { 150 | return licFileName; 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /src/sample/Main.java: -------------------------------------------------------------------------------- 1 | package sample; 2 | 3 | import java.io.File; 4 | 5 | import javafx.application.Application; 6 | import javafx.event.ActionEvent; 7 | import javafx.event.EventHandler; 8 | import javafx.fxml.FXMLLoader; 9 | import javafx.geometry.Insets; 10 | import javafx.scene.Parent; 11 | import javafx.scene.Scene; 12 | import javafx.scene.control.Button; 13 | import javafx.scene.control.TextArea; 14 | import javafx.scene.layout.VBox; 15 | import javafx.stage.DirectoryChooser; 16 | import javafx.stage.Stage; 17 | 18 | import java.awt.*; 19 | 20 | public class Main extends Application { 21 | 22 | public static final String WINDOW_TITLE = "LicDataExtractor version. 1.02"; 23 | public static final String BUTTON_LABLE = "Выбор папки"; 24 | private File dir = null; 25 | private String licFileName; 26 | 27 | @Override 28 | public void start(final Stage primaryStage) throws Exception { 29 | 30 | final DirectoryChooser directoryChooser = new DirectoryChooser(); 31 | configuringDirectoryChooser(directoryChooser); 32 | 33 | final TextArea textArea = new TextArea(); 34 | textArea.setMinHeight(70); 35 | Button button = new Button(BUTTON_LABLE); 36 | 37 | button.setOnAction(new EventHandler() { 38 | @Override 39 | public void handle(ActionEvent event) { 40 | textArea.setText("Ждите..."); 41 | configuringDirectoryChooser(directoryChooser); 42 | dir = directoryChooser.showDialog(primaryStage); 43 | 44 | if (dir != null) { 45 | Extractor extractor = new Extractor(dir.getAbsolutePath()); 46 | String regInfo = extractor.getResult(); 47 | 48 | if (regInfo.startsWith("Файл: ")) { 49 | RegDataWriter writer = new RegDataWriter(dir.getAbsolutePath(), regInfo); 50 | writer.saveToFile(extractor.getLicFileName()); 51 | } 52 | 53 | textArea.setText(dir.getAbsolutePath() + "\n" + regInfo); 54 | } else { 55 | textArea.setText(null); 56 | } 57 | } 58 | }); 59 | 60 | VBox root = new VBox(); 61 | root.setPadding(new Insets(10)); 62 | root.setSpacing(5); 63 | root.getChildren().addAll(textArea, button); 64 | 65 | Scene scene = new Scene(root, 400, 200); 66 | 67 | primaryStage.setTitle(WINDOW_TITLE); 68 | primaryStage.setScene(scene); 69 | primaryStage.show(); 70 | } 71 | 72 | private void configuringDirectoryChooser(DirectoryChooser directoryChooser) { 73 | // Set title for DirectoryChooser 74 | directoryChooser.setTitle("Выберите папку: "); 75 | 76 | // Set Initial Directory 77 | // directoryChooser.setInitialDirectory(new File(System.getProperty("user.home"))); 78 | if (dir != null) { 79 | directoryChooser.setInitialDirectory(dir); 80 | } 81 | } 82 | 83 | 84 | public static void main(String[] args) { 85 | 86 | launch(args); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/sample/RegDataWriter.java: -------------------------------------------------------------------------------- 1 | package sample; 2 | 3 | import java.io.File; 4 | import java.io.FileWriter; 5 | 6 | public class RegDataWriter { 7 | public String fullDirectoryName; 8 | public String rezult; 9 | 10 | public RegDataWriter(String fullDirectoryName, String rezult) { 11 | this.fullDirectoryName = fullDirectoryName; 12 | this.rezult = rezult; 13 | } 14 | 15 | public void saveToFile(String licFileName) { 16 | 17 | String path = fullDirectoryName + "\\" + licFileName.replace(".lic", "") + "_LicData.txt"; 18 | System.out.println("path = " + path); 19 | try { 20 | File file = new File(path); 21 | FileWriter fw = new FileWriter(file); 22 | fw.write(rezult); 23 | fw.flush(); 24 | fw.close(); 25 | System.out.println("File saved"); 26 | } catch (Exception e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Достаем информацию из файла лицензии 1С.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/miller7777777/LicDataExtractor/99a8152c7be2b574696314f6acad151f3dc186b4/Достаем информацию из файла лицензии 1С.docx --------------------------------------------------------------------------------