Преобразование файла .ps1 в службу Windows - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь преобразовать файл .ps1 для запуска в качестве службы Windows.Это должно работать как служба, поскольку это требования для непрерывности бизнеса (запланированная задача не вариант).Я всегда использовал NSSM, чтобы обернуть .ps1, так как он будет работать через NSSM как exe.

Это работает для разных сценариев в Windows Server 2012, но этот сценарий немного отличается, и мне требуетсязаставить эту службу работать на Windows Server 2016. Сам сценарий подключается к большому количеству других серверов (всего у меня будет 3 службы - Служба Windows / Процесс Windows / Процесс Linux), которые работают только при запуске внутри PowerShell.

Ниже приведен пример запуска сценария, поэтому вы получите представление о том, как он работает (может быть не актуально);

 while ($test = 1)
{

         [string]$query
          [string]$dbServer = "DBSERVER"   # DB Server (either IP or hostname)
          [string]$dbName   = "DBNAME" # Name of the database
          [string]$dbUser   = "CONNECTIONUSER"    # User we'll use to connect to the database/server
          [string]$dbPass   = "CONNECTIONPASSWORD"     # Password for the $dbUser


    $conn = New-Object System.Data.Odbc.OdbcConnection
    $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;"
    $conn.open()
    $cmd = New-object System.Data.Odbc.OdbcCommand("select * from DBNAME.TABLENAME where typeofcheck = 'Windows Service' and active = 'Yes'",$conn)
    $ds = New-Object system.Data.DataSet
    (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null
    $conn.close()

$results = $ds.Tables[0]
$Output = @()

        foreach ($result in $results)
        {

            $Hostone = $Result.hostone
            $Hosttwo = $Result.hosttwo
            $Hostthree = $Result.hostthree
            $Hostfour = $Result.hostfour

        Write-Output "checking DB ID $($result.id)"

            #Host One Check
            if (!$result.hostone)
            {
            $hostonestatus = 17
            $result.hostone = ""
            }
            else
            {
            try
               {
                    if(Test-Connection -ComputerName $result.hostone -quiet -count 1)
                    {
                    $hostoneres = GET-SERVICE -COMPUTERNAME $result.hostone -NAME $result.ServiceName -ErrorAction Stop
                    $hostonestatus = $hostoneres.status.value__
                    $Result.HostOneCheckTime = "Last checked from $env:COMPUTERNAME at $(Get-date)"
                    }
                    else
                    {
                    $hostonestatus = 0
                    $result.hostonestatus = "Failed"
                    $Result.HostOneCheckTime = "Last checked from $env:COMPUTERNAME at $(Get-date)"
                    }
                }
                catch
                {
                    $hostonestatus = 0
                    $result.hostonestatus = "Failed"
                    $Result.HostOneCheckTime = "Last checked from $env:COMPUTERNAME at $(Get-date) Errors Found"
                }
                    if ($hostonestatus -eq 4)
                        {
                            $result.hostonestatus = "Running"
                        }
                    if ($hostonestatus -eq 1)
                        {
                            $result.hostonestatus = "Stopped"
                        }
                    elseif ($hostonestatus -eq 0)
                        {
                            $result.hostonestatus = "Failed"
                        }

                    }

Как уже упоминалось, точный сценарий запускаавтономный работает без проблем .

Каков наилучший способ запустить это как службу или есть какие-либо известные проблемы с NSSM при использовании его с Windows Server 2016?

Я также нашелниже, который может указывать в правильном направлении, так как я периодически получал их в журналах;

DCOM событие 10016 регистрируется в Windows

1 Ответ

0 голосов
/ 26 сентября 2019

Системный администратор Windows здесь.

Несколько различных способов сделать это с чисто сервис-ориентированной точки зрения.

--- 1 ---

Если выЯ использую Server 2016, я считаю, что команда Powershell 'New-Service' может быть одним из самых чистых способов.Посмотрите на следующее для синтаксиса и, если это соответствует вашему варианту использования -

https://support.microsoft.com/en-au/help/137890/how-to-create-a-user-defined-service

Этот CMDlet принимает параметр учетных данных, поэтому в зависимости от вашего варианта использования может быть полезно получить доступресурсы на других сторонних машинах.

--- 2 ---

Другой способ - использовать старую надежную встроенную утилиту SC.exe в Windows.

SC CREATE <servicename> Displayname= "<servicename>" binpath= "srvstart.exe <servicename> -c <path to srvstart config file>" start= <starttype>

Пример -

SC CREATE Plex Displayname= "Plex" binpath= "srvstart.exe Plex -c C:PlexService.ini" start= auto

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

https://support.microsoft.com/en-au/help/251192/how-to-create-a-windows-service-by-using-sc-exe

https://www.howtogeek.com/50786/using-srvstart-to-run-any-application-as-a-windows-service/

--- 3 ---

Возможно, вы захотите вручную добавить некоторые ключи реестра для создания собственной службы (котораяэто, по сути, то, что делает SC.exe под капотом).

Хотя, к сожалению, в настоящий момент я не в состоянии предоставить код котельной пластины, я бы посоветовал вам взглянуть на следующий ресурс:

https://www.osronline.com/article.cfm%5Eid=170.htm 

ПРИМЕЧАНИЕ. Вам потребуется предоставить все необходимые вложенные ключи, чтобы он работал.

Как и при любых изменениях реестра, сделайте резервную копию своего реестра и внесите изменения на свой компьютер.собственный риск до внесения каких-либо изменений.Я могу только рекомендовать попробовать это на резервной / тестовой виртуальной машине, если это возможно, до внедрения в prod.

...