将 .ps1 文件转换为 Windows 服务
Converting .ps1 file to a Windows Service
我正在尝试将 .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"
}
}
如前所述,运行ning 独立脚本可以无缝运行。
将此作为服务运行 的最佳方法是什么,或者在 Windows Server 2016 中使用 NSSM 时是否存在任何已知问题?
我还发现以下内容可能指向正确的方向,因为我间歇性地在日志中找到了这些内容;
Windows 这里是系统管理员。
从纯粹的面向服务的角度静默几个不同的方法来完成这个。
--- 1 ---
如果您使用的是 Server 2016,我相信 Powershell 命令 'New-Service' 可能是最简洁的方法之一。查看以下语法以及它是否适合您的用例 --
https://support.microsoft.com/en-au/help/137890/how-to-create-a-user-defined-service
此 CMDlet 采用凭据参数,因此根据您的用例,访问其他外国机器上的资源可能会很好。
--- 2 ---
另一种方法是在 windows.
中使用旧的可靠内置 SC.exe 实用程序
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
注意 - 您需要提供所有必需的子密钥才能正常工作。
与任何注册表更改一样,请在进行任何更改之前备份您的注册表并自行承担编辑风险。如果可能的话,我只能建议在 spare/test VM 上尝试此操作,然后再实施到产品。
我正在尝试将 .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"
}
}
如前所述,运行ning 独立脚本可以无缝运行。
将此作为服务运行 的最佳方法是什么,或者在 Windows Server 2016 中使用 NSSM 时是否存在任何已知问题?
我还发现以下内容可能指向正确的方向,因为我间歇性地在日志中找到了这些内容;
Windows 这里是系统管理员。
从纯粹的面向服务的角度静默几个不同的方法来完成这个。
--- 1 ---
如果您使用的是 Server 2016,我相信 Powershell 命令 'New-Service' 可能是最简洁的方法之一。查看以下语法以及它是否适合您的用例 --
https://support.microsoft.com/en-au/help/137890/how-to-create-a-user-defined-service
此 CMDlet 采用凭据参数,因此根据您的用例,访问其他外国机器上的资源可能会很好。
--- 2 ---
另一种方法是在 windows.
中使用旧的可靠内置 SC.exe 实用程序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
注意 - 您需要提供所有必需的子密钥才能正常工作。
与任何注册表更改一样,请在进行任何更改之前备份您的注册表并自行承担编辑风险。如果可能的话,我只能建议在 spare/test VM 上尝试此操作,然后再实施到产品。