Как создать службу Windows, которая отслеживает версию указанного приложения c и изменяет файл, если он изменяется - PullRequest
0 голосов
/ 13 марта 2020

У меня очень мало опыта с C#. Я нахожусь в процессе изучения этого, но считаю, что написание кода для этого немного выше моего уровня квалификации.

Вот сценарий: в компании, в которой я работаю, у нас около 1200 устройств с одной и той же программой, написанной третьей стороной. Нам пришлось внести некоторые изменения в один из их конфигурационных файлов, чтобы приложение могло корректно работать в нашей среде.

Вот большая часть конфигурационного файла:

<?xml version="1.0"?>
<configuration>
    <appSettings file="%ProgramData%\NCR\RAL\AlhAdmin.exe.config">
        <add key="ConfigurationDataFile" value="AlhAdmin.xml"/>     <!--Config Data Xml File -->
        <!--Log File Details -->
        <!--<add key="ApplicationLogPath" value=""/>-->
        <add key="ApplicationLogName" value="AlhAdmin"/>
        <!--Number of Days to keep log -->
        <add key="ApplicationLogDaysToRetain" value="2"/>
        <!--Port Number to be entered here-->
        <add key="SocketListenPort" value="11000"/>
        <add key="MulticastUDPSendPort" value="11001"/>
        <add key="MulticastUDPSendBroadcastAddress" value="224.168.100.25"/>
        <add key="MulticastUDPListenPort" value="11002"/>
        <add key="MulticastUDPListenBroadcastAddress" value="224.168.100.35"/>
        <add key="DefaultSelTime" value="30"/>
        <add key="DefaultTermSelTime" value="30"/>
        <add key="DefaultLANWaitTime" value="2"/>
        <!--DisplayMessage Form-->
        <add key="MessageDisplayFile" value="DisplayMessages.xml"/>
        <!--RFC: 55071-->
        <add key="UltraVNCFolderPathInFS" value="\ExtData\RAL\UltraVNC"/>
        <add key="StartUpFolderPath" value="C:\Documents and Settings\All Users\Start Menu\Programs\Startup"/>
        <add key="ProgramFileFolderPath" value="C:\Program Files"/>
        <add key="NetworkGroupBMP" value="Network.ico"/>
        <!--RFC: 52790-->
        <add key="DebugLevel" value="25"/>
        <add key="BaseIPToIncr" value="192.168.0"/>
        <add key="BaseIPToIncrSubNet" value="255.255.255.0"/>
        <add key="CheckForConnectedNIC" value="0"/>         <!-- Check for only NICs that are connected /-->
        <add key="AddAdminGroup" value="0"/>
        <add key="SetGatewayInfo" value="1" />    <!-- Wheter order to set the server gateway and DNS entries on the terminal-->
        <add key="CopyRemotely" value="1"/>             <!-- Whether to copy remotely or use Bootdrv share /-->
        <!-- add key="RemoteCopyPort" value="11003" /-->        <!-- Remote copy port on which server is copying /-->
        <!-- add key="ServerIPEntryRequired" value="1" --/>     <!-- Pops the screen to select Server Name/IP /-->
        <!-- add key="QWERTY" value="0" /-->                    <!-- Keyboard style for above screen /-->
        <!-- add key="IPScreenTimeout" value="120" /-->         <!-- Timeout for Server IP Screen /-->
        <!-- add key="Base1stOctet" value="1" /-->              <!-- Start number for the 1st Octet /-->
        <!-- add key="Default1stOctet" value="1" /-->           <!-- Default 1st Octet for IP Screen /-->
        <!-- add key="Default2ndOctet" value="0" /-->           <!-- Default 2nd Octet for IP Screen /-->
        <!-- add key="Default3rdOctet" value="0" /-->           <!-- Default 3rd Octet for IP Screen /-->
        <!-- add key="Default4thOctet" value="1" /-->           <!-- Default 4th Octet for IP Screen /-->
        <!-- add key="DefaultServerName" value="" /-->          <!-- Default Server Name for IP Screen /-->
        <!-- add key="SetEncryptedPassword" value="1" /-->      <!-- Sets password encrypted /-->
        <add key="SetDefaultDomain" value="0" />    <!-- Sets Default domain in the registry /-->
        <!-- add key="BackupData" value="0" /-->    <!-- Backs up  Data folder over to ExtData\RAL\Data /-->
        <!-- add key="DisableAdmin" value="0" /-->    <!-- disables administrator account  /-->
    </appSettings>
    <startup>

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

Нам пришлось раскомментировать строку <!-- add key="ServerIPEntryRequired" value="1" --/>. Это уже сделано на нашем имидже, поэтому мы обычно не должны что-то менять. Но при тестировании новых версий программного обеспечения я обнаружил, что при установке новой версии текущая версия полностью удаляется, а затем устанавливается новая версия, что означает, что измененный файл конфигурации сбрасывается в состояние по умолчанию.

То, что я пытаюсь сделать, - это создать службу Windows, которая отслеживает это приложение, и, если версия приложения изменяется, то изменить файл конфигурации. Я нашел способ получить версию приложения, которая, как мне кажется, будет работать:

private string GetSoftwareVersion (string softwareName)
        {
            string stringVersion = string.Empty;
            try
            {
                var version = (object)null;
                // Query the system registry for the version of the given software
                var searcher = new ManagementObjectSearcher(
                    "SELECT * FROM Win32_Product where Name LIKE " +
                    "'%" + softwareName + "%'");
                foreach (ManagementObject obj in searcher.Get())
                {
                    version = obj["Version"];
                }
                if (version != null)
                {
                    stringVersion = (String)version;
                }
                // If the given product is not found in the list of installed products in control panel
                else
                {
                    stringVersion = "The given application is not found in the list of Installed Programs.";
                }
            }
            // Exception handling
            catch (Exception e)
            {
                stringVersion = "An error occured while getting Version" +
                    " (" + e.Message + ")";
            }
            return stringVersion;
        }

В чем я не уверен, так это в изменении файла конфигурации, так как это не настоящий файл XML так как у него нет пространства имен. После этого он выясняет, как на самом деле контролировать приложение.

Надеюсь, этого достаточно для начала работы. Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 05 мая 2020

Идея файловой системы - это отличная идея, но она ухудшается, если просматриваются много папок. Какое-нибудь мнение было дано периодически запускать проверку? Установленный как сервис, вы можете запланировать его запуск каждый час (или любой другой) и искать изменения.

Это сконфигурировано как агент, который запускается на удаленных машинах, чтобы сообщать о своих результатах обратно на сервер?

...