当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 将 PowerShell 脚本 (*.PS1) 作为 Windows 服务运行

作者:精品下载站 日期:2024-12-14 20:06:11 浏览:15 分类:玩电脑

将 PowerShell 脚本 (*.PS1) 作为 Windows 服务运行


任何 PowerShell 脚本都可以转换为真正的 Windows 服务,该服务在后台运行并在服务器启动期间自动启动您可以使用以下命令创建 Windows 服务

srvany.exe

或者

instsrv.exe

工具(来自 Windows Server Resource 2003 Kit),允许您运行

powershell.exe

使用包含 PS1 脚本文件路径的参数进行处理。

使用此方法创建服务的主要缺点是 srvany.exe 无法控制 PowerShell 脚本执行状态,如果应用程序崩溃(挂起),服务不会看到它并继续工作。要从包含 PowerShell 脚本的文件创建 Windows 服务,在本文中我们将使用 NSSM (Non-Sucking Service Manager) 工具包,该工具包不会演示上述缺点。

您可以手动或使用 Chocolatey 下载并安装 NSSM。首先,安装 Choco 本身:

Set-ExecutionPolicy Bypass -Scope Process -Force; `
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

然后安装 NSSM 包:

choco install nssm

在此示例中,我们将实时跟踪特定 Active Directory 组中的更改,并使用弹出通知和电子邮件通知安全管理员(本文给出了脚本)。

因此,我们有一个需要保存为 PS1 文件的 PowerShell 代码。让我们添加一个无限循环,每分钟执行一次检查:

while($true) {
#Your PS code
Start-Sleep -Seconds 60
}

当然,要实现这样的场景,您可以在任务计划程序中创建单独的任务。但如果你必须实时响应变化,那么单独的服务方法更好。

您可以直接从 PowerShell 使用 NSSM 从 PowerShell 脚本创建服务:

$NSSMPath = (Get-Command "C:\ps\nssm\win64\nssm.exe").Source
$NewServiceName = “CheckADGroup”
$PoShPath= (Get-Command powershell).Source
$PoShScriptPath = “C:\ps\CheckADGroup\checkad.ps1”
$args = '-ExecutionPolicy Bypass -NoProfile -File "{0}"' -f $PoShScriptPath
& $NSSMPath install $NewServiceName $PoShPath $args
& $NSSMPath status $NewServiceName

开始您的新服务:

Start-Service $NewServiceName

在 PowerShell 中检查服务状态:

Get-Service $NewServiceName

[玩转系统] 将 PowerShell 脚本 (*.PS1) 作为 Windows 服务运行

现在您已经创建并启动了新的 Windows 服务。确保它已出现在服务管理控制台 (services.msc) 中。

CheckADGroup 已出现,它被配置为自动启动并且当前正在运行。如您所见,您的 PowerShell 脚本正在 nssm.exe 进程内运行。

[玩转系统] 将 PowerShell 脚本 (*.PS1) 作为 Windows 服务运行

请注意,该服务在系统帐户下运行。如果您在 PowerShell 脚本中使用其他模块(在我的例子中,使用 Windows PowerShell 的 Active Directory 中的 Get-ADGroupMember 来获取域安全组中的成员列表),则此帐户必须有权访问 PS 模块文件和 AD 连接权限(在我的例子中)。您还可以在另一个域帐户(或 gMSA 帐户)下启动此服务,并允许用户在没有本地管理员权限的情况下停止/重新启动该服务。

为了使服务可以在用户会话中显示通知,请启用登录选项卡上的允许服务与桌面交互选项。

要使其在 Windows 10 和 Windows Server 2012 R2/2016 中工作,请将注册表项 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows 中的 DWORD NoInteractiveServices 参数值更改为 0 并运行 Interactive Services Inspection Service

Start-Service -Name ui0detect

但是,交互式服务检测服务已从 Windows 10 build 1803 中完全删除,您将无法切换到会话 0。因此您不会看到系统帐户下显示的通知窗口。

您可以使用以下命令更改服务描述:

& $NSSMPath set $NewServiceName description “Monitoring of AD group changes”

要删除您创建的服务,请使用

sc delete

命令或:

nssm remove CheckADGroup

[玩转系统] 将 PowerShell 脚本 (*.PS1) 作为 Windows 服务运行

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯