我正在尝试在 Windows 2016 上创建一个新服务(AppOneTest),该服务应该在 services.msc 中可用,并且每当服务启动(AppOneTest)时,它都应该启动进程资源管理器
$ServiceName = "ApplicationOneTest"
$ServiceDisplayName = "AppOneTest"
$ServiceDescription = "This launches process explorer"
$ExecutablePath = "C:\processexp\procexp64.exe"
$ScriptPath = "C:\Backup\LaunchScript.ps1"
$LaunchScript = @"
# Script to launch processexp
& '$ExecutablePath'
"@
$LaunchScript | Out-File -FilePath $ScriptPath -Encoding utf8
New-Service -Name $ServiceName -DisplayName $ServiceDisplayName -Description $ServiceDescription -BinaryPathName "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File $ScriptPath" -StartupType Automatic
sc.exe config $ServiceName obj= "domain\username" password= "******" type= interact
Start-Service -Name $ServiceName
此脚本将尝试创建并启动该服务。但是,当我尝试启动已创建的服务时,它卡住了,无法启动。
任何帮助都将不胜感激。
答案1
从 Windows Vista 开始,交互式服务大多效率低下,不应使用。
服务程序必须遵循特定的接口,它们必须与服务控制管理器交互,发出信号以显示其状态等。Process Explorer 或任何其他普通应用程序都不会这样做。
您可以使用类似的服务包装器国家安全监测中心将任意程序作为服务运行。这是 Java 服务器应用程序的流行解决方案。
要运行 UI 测试,您应该使用配置了自动登录并禁用显示睡眠/锁定的 VM,然后在始终打开的常规会话中运行测试。
答案2
您正在尝试运行交互式系统服务。不建议这样做,除了我的答案之外,可能还有一些复杂问题需要解决。请注意,并非每个程序都使用系统服务协议运行,我真的怀疑 Explorer 是否合适。您可能会在 这个答案 有助于从这些不合适的程序中创建临时服务: 斯瓦尼和 国家安全监测中心。
至少,您需要让服务在与登录用户相同的用户帐户下运行。在 PowerShell 中,这意味着使用私人秘书凭证 包含用户凭证的对象。
示例代码:
$username = "username"
$password = "password"
$securepassword = ConvertTo-SecureString $password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential ($username, $securepassword)
New-Service [...] -Credential $cred
参考: