在保持个人设置的同时更改程序设置

背景知识


在一个医疗机构中,他们基于Orthanc PACS服务器和Radiant的DICOM客户端实施了解决方案。 在安装过程中,我们发现每个DICOM客户端都应在PACS服务器中进行如下描述:

  • 客户姓名
  • AE名称(必须唯一)
  • 一个TCP端口,该端口在客户端自动打开,并从PACS服务器接收DICOM检查(即服务器将它们推向客户端,就像首先启动连接一样)
  • IP地址

设置Radiant客户端后,需要考虑以下信息-对于每个客户端,使用上述参数设置软件都会导致填充pacs.xml文件,该文件位于用户配置文件中(路径: %APPDATA%\ RadiantViewer \ pacs.xml )。 同时,一个客户端与另一个客户端的配置至少相差两个参数(AE名称对于每个人而言都是不同的,并且端口基本相同,除了在同一服务器上运行的终端客户端-您还必须为端口分配不同的端口)。

链接中的示例pacs.xml文件:

在大约半年的时间里,一切都很好,系统正常工作……然后“ 陷阱 ”传到了我们:

  • 我们需要将几台新的PACS服务器投入运行,它们将替换旧的(磁盘空间开始用完的)旧服务器。 虚拟机中的PACS服务器,但与此无关。
  • 我们需要以某种方式集中更改200台机器(其数量定期增加)上的唯一配置(具有两个不同的参数);
  • 考虑到检查量的增长速度,解决方案不是一次性的,而是重复的和定期的(例如,每3-5个月一次)。

解决方案如下。

解决问题的工具的选择


最初,人们试图找到一些解决方案来更改客户端上的pacs.xml文件并更改PACS服务器列表,而无需更改AE名称和TCP端口设置。 当时的Windows客户端都是基于Windows XP和Windows 7的-因此,有人尝试基于VBScript编写类似的东西。 但是,遗憾的是,由于完全缺乏用这种语言编写任何复杂内容的经验,因此不可能克服这样的任务。 查找和重写的尝试也都没有成功(应该注意的是,我脑子里已经有了一个不同的计划,因此我花了超过3-4个小时的时间才去理会VBScript)。

最后,我确定了以下解决方案:

  • 通过组策略将所有pacs.xml文件收集在网络共享中任何服务器上的某个位置;
  • 批量修改文件(已经有解决此类问题的经验-使用Perl);
  • 另外,使用组策略来更新客户端设置。

使用组策略收集文件


最简单的部分是,当客户登录到他的个人资料时,他具有自己的权限运行一个特定的.bat文件,该文件在其中写入:

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

因此,pacs.xml文件将在服务器上的隐藏资源中累积,该文件的名称包含从此计算机和用户复制此配置的信息。

最困难的事情是等待所有用户完成此策略。

使用Perl脚本更改配置


我们需要ActiveState的Windows Active Perl ,以及XML :: Writer模块,可以使用ppm install XML-Writer命令安装它

脚本本身非常简单:

 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); } } } 

其工作原理:

  • 我们打开从客户端收集pacs.xml配置的目录,并将文件列表放入标量数组(@report_files);
  • 在一个循环中,我们一次处理一个文件并逐行读取;
  • 使用split,将每行分成5部分,使用引号作为分隔符;
  • 我们找到带有单词listener的行,并为每个文件放入两个变量唯一的数据(客户端AE名称和TCP端口号);
  • 之后,我们只需创建一个新的XML文件,在其中输入唯一的参数,然后插入所需数量的PACS服务器及其参数即可, 一切都开始的东西
  • 在旧文件的顶部重写新的XML文件。

应该注意的是,实际上我并没有完全自动使用此脚本-实际上,我将收集的配置复制到单独的目录中,然后运行该脚本并一起更改它们。 然后进行随机检查-并将配置重新注入计算机。

将修改后的pacs.xml文件分发给客户端


对我而言,最简单的事情是对已经工作的.bat文件进行更改,该文件从客户端收集配置并添加一行:

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

生成的.bat文件如下所示:

 @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 

结论


这就是“ 膝盖高 ”的解决方案。 我们已经对它进行了两次测试(分别于2018年9月和2019年2月),而飞行却是正常的。 当然,它不会更新100%的客户端,但接近此值-我们将远程完成其余的操作。 引用脚本。

Source: https://habr.com/ru/post/zh-CN448270/


All Articles