Ändern Sie die Programmeinstellungen, während Sie die persönlichen Einstellungen beibehalten

Hintergrund


In einer medizinischen Organisation implementierten sie Lösungen, die auf Orthanc PACS-Servern und dem DICOM-Client von Radiant basieren. Während des Setups haben wir herausgefunden, dass jeder DICOM-Client auf PACS-Servern wie folgt beschrieben werden sollte:

  • Kundenname
  • AE-Name (muss eindeutig sein)
  • Ein TCP-Port, der auf der Clientseite automatisch geöffnet wird und DICOM-Untersuchungen vom PACS-Server empfängt (d. H. Der Server schiebt sie sozusagen zum Client, indem er zuerst die Verbindung initiiert).
  • IP-Adresse

Nach dem Einrichten von Radiant-Clients wurden die folgenden Informationen zur Prüfung erhalten: Für jeden Client führte das Einrichten der Software mit den oben genannten Parametern zum Ausfüllen der Datei pacs.xml , die sich im Benutzerprofil befand (Pfad: % APPDATA% \ RadiantViewer \ pacs.xml ). Gleichzeitig unterschied sich die Konfiguration eines Clients von einem anderen durch mindestens zwei Parameter (der AE-Name ist für alle unterschiedlich und der Port ist grundsätzlich gleich, mit Ausnahme von Terminal-Clients, die auf demselben Server ausgeführt werden - dort mussten Sie auch die Ports unterschiedlich zuweisen).

Beispieldatei pacs.xml über den Link :

Etwa ein halbes Jahr lang war alles in Ordnung, das System funktionierte ... und dann erreichten uns die " Fallstricke ":

  • Wir müssen mehrere neue PACS-Server in Betrieb nehmen, die die alten ersetzen (wo der Speicherplatz knapp wurde). PACS-Server in virtuellen Maschinen, aber darum geht es nicht.
  • Wir müssen die einzigartigen Konfigurationen auf 200 Maschinen zentral (mit zwei verschiedenen Parametern) ändern (ihre Anzahl wird regelmäßig erhöht).
  • Angesichts der Wachstumsrate des Untersuchungsvolumens handelt es sich bei der Lösung nicht um eine einmalige, sondern um eine replizierte und regelmäßige Lösung (z. B. einmal alle 3 bis 5 Monate).

Die Lösung ist unten.

Die Auswahl der Werkzeuge zur Lösung des Problems


Anfänglich gab es Versuche, eine Lösung zu finden, die die Datei pacs.xml auf der Clientseite änderte und Änderungen an der Liste der PACS-Server vornahm, ohne den AE-Namen und die TCP-Porteinstellungen zu berühren. Zu dieser Zeit basierten Windows-Clients sowohl auf Windows XP als auch auf Windows 7 - daher gab es Versuche, so etwas auf der Basis von VBScript zu schreiben. Leider war es nicht möglich, eine solche Aufgabe zu bewältigen, da es an Erfahrung mangelte, etwas Kompliziertes und Komplexes in dieser Sprache zu schreiben. Versuche zu finden und neu zu schreiben waren ebenfalls erfolglos (es sollte beachtet werden, dass es bereits einen anderen Plan in meinem Kopf gab, so dass ich mich nicht länger als 3-4 Stunden mit VBScript beschäftigte).

Am Ende habe ich mich für folgende Lösung entschieden:

  • Sammeln Sie alle pacs.xml-Dateien an einem Ort auf einem Server in einer Netzwerkfreigabe nach Gruppenrichtlinien.
  • Ändern Sie Dateien in großen Mengen (es wurden bereits Erfahrungen mit der Lösung solcher Probleme gesammelt - mit Perl).
  • Verwenden Sie außerdem Gruppenrichtlinien, um die Clienteinstellungen zu aktualisieren.

Sammeln von Dateien mithilfe von Gruppenrichtlinien


Der einfachste Teil ist, dass ein Client, wenn er sich in sein Profil einloggt, mit seinen Rechten eine bestimmte .bat-Datei ausführt, in der sie geschrieben ist:

echo off If exist %APPDATA%\RadiantViewer\pacs.xml copy %APPDATA%\RadiantViewer\pacs.xml \\srv.test.local\pconfigs$\pacs-%COMPUTERNAME%-%USERNAME%.xml 

Daher werden pacs.xml-Dateien auf dem Server in einer versteckten Ressource gesammelt, deren Name Informationen enthält, von welchem ​​Computer und von welchem ​​Benutzer diese Konfiguration kopiert wurde.

Am schwierigsten war es, darauf zu warten, dass alle Benutzer diese Richtlinie ausfüllen.

Ändern von Konfigurationen mithilfe eines Perl-Skripts


Wir benötigen Active Perl für Windows von ActiveState sowie das XML :: Writer-Modul, das mit dem Befehl ppm install XML-Writer installiert werden kann.

Das Skript selbst erwies sich als recht einfach:

 use XML::Writer; #    ,   ( ): $report_dir = "C:\\Perl64\\WORK\\PACS-xml3\\"; opendir(DIR, "$report_dir") or die "     !"; @report_files = readdir DIR; shift (@report_files); #      (.) shift (@report_files); #       (..) # print "@report_files"; closedir(DIR); #    -    .    AET     . foreach $analiz_file (@report_files) { $full_path_to_file="C:\\Perl64\\WORK\\PACS-xml3\\".$analiz_file; open (INFO, $full_path_to_file); while ($line = <INFO>) { #  $aet  $port      XML : my ($other1, $aet, $other2, $port, $other3) = split /\"/, $line, 5; #    listener -           XML: if ($other1 =~ 'listener') { #   XML c    : my $writer = XML::Writer->new(OUTPUT => 'self', DATA_MODE => 1, DATA_INDENT => 2, ); $writer->xmlDecl('utf-8'); $writer->startTag('pacs'); $writer->startTag('listener', ae => $aet, port => $port); $writer->endTag(); $writer->startTag('hosts'); $writer->startTag('host', name => 'MRT', ae => 'ORTHANC', ip => 'XX.YY.214.17', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0'); $writer->endTag(); $writer->startTag('host', name => 'KT', ae => 'ORTHANC2', ip => 'XX.YY.215.253', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0'); $writer->endTag(); $writer->startTag('host', name => 'R', ae => 'ORTHANC3', ip => 'XX.YY.215.252', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0'); $writer->endTag(); $writer->startTag('host', name => 'KT-20180501-20180831', ae => 'ORTHANC4', ip => 'XX.YY.215.251', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0'); $writer->endTag(); $writer->startTag('host', name => 'KT-20180901-20181130', ae => 'ORTHANC5', ip => 'XX.YY.215.250', ts => '1.2.840.10008.1.2.1', port => '4242', maxassoc => '1', allpres => '0', search => '1', protocol => '1', searchcharset => '', wildcards => '3', carets => '0'); $writer->endTag(); $writer->endTag('hosts'); $writer->startTag('presets'); $writer->endTag(); $writer->startTag('lastsearch', dt => '4', mfid => '1048592'); $writer->endTag(); $writer->endTag('pacs'); #   XML  : my $xml = $writer->end(); #    : $rewritexml = $full_path_to_file; #  XML   : open (NEWXML, ">$rewritexml"); print NEWXML $xml; close (NEWXML); } } } 

Das Prinzip seiner Arbeit:

  • Wir öffnen das Verzeichnis, in dem wir pacs.xml-Konfigurationen von Clients gesammelt haben, und legen die Liste der Dateien in einem Array von Skalaren (@report_files) ab.
  • In einer Schleife verarbeiten wir jeweils eine Datei und lesen sie Zeile für Zeile.
  • Teilen Sie jede Zeile mit split in 5 Teile und verwenden Sie Anführungszeichen als Trennzeichen.
  • Wir finden die Zeile mit dem Wort Listener und geben für jede Datei zwei eindeutige Daten ein (Client-AE-Name und TCP-Portnummer).
  • Danach erstellen wir einfach eine neue XML-Datei, geben eindeutige Parameter ein und fügen dann die erforderliche Anzahl von PACS-Servern mit ihren Parametern ein - d. H. etwas, für das alles begonnen wurde )
  • Schreiben Sie die neue XML-Datei über die alte.

Es ist zu beachten, dass ich dieses Skript nicht vollständig automatisch verwende. Tatsächlich kopiere ich die gesammelten Konfigurationen in ein separates Verzeichnis, führe das Skript aus und ändere sie alle zusammen. Dann eine Stichprobenprüfung - und die Konfigurationen können wieder in die Maschinen gegossen werden.

Verteilen geänderter pacs.xml-Dateien an Clients


Das Einfachste, was mir in den Sinn kam, war, Änderungen an einer bereits funktionierenden .bat-Datei vorzunehmen, die Konfigurationen von Clients sammelt und eine Zeile hinzufügt:

 If exist %APPDATA%\RadiantViewer\pacs.xml copy /Y \\srv.test.local\pconfigsnew$\pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%\RadiantViewer\pacs.xml 

Die resultierende .bat-Datei sieht folgendermaßen aus:

 @echo off If exist %APPDATA%\RadiantViewer\pacs.xml copy %APPDATA%\RadiantViewer\pacs.xml \\srv.test.local\pconfigs$\pacs-%COMPUTERNAME%-%USERNAME%.xml If exist %APPDATA%\RadiantViewer\pacs.xml copy /Y \\srv.test.local\pconfigsnew$\pacs-%COMPUTERNAME%-%USERNAME%.xml %APPDATA%\RadiantViewer\pacs.xml 

Fazit


Dies ist die „ kniehohe “ Lösung. Wir haben es bereits zweimal getestet (im September 2018 und im Februar 2019), während der Flug normal war. Natürlich werden nicht 100% der Clients aktualisiert, aber nahe an diesem Wert - wir erledigen den Rest remote. Skript als Referenz .

Source: https://habr.com/ru/post/de448270/


All Articles