使用 Service Start 运行 PowerShell 脚本

使用 Service Start 运行 PowerShell 脚本

我想在服务进程启动时设置Affinity它的Priority没有修改服务/流程代码,我拥有代码,它是第三方服务)。

我知道我能做到:

$Process = Get-Process MyService $Process.ProcessorAffinity = 4

电源外壳更改Affinity进程或在命令路径前添加前缀:

cmd.exe /c start "Some Process Name" /affinity 4

然而,两者都不这些适用于自动更改服务流程AffinityPriority每次服务已启动)我该怎么做没有使用一些在重启后“维持”进程亲和性的第三方应用程序(我会真的喜欢自己编写/创建解决方案而不是依赖另一个应用程序来“配置”窗口)。

答案1

看看这篇文章: http://waynes-world-it.blogspot.ca/2009/06/processor-affinity-on-windows-server.html

如果您尝试控制某项服务,则可以使用 instsrv/srvany 创建一个服务,该服务将 start 或 psexec 命令包装在实际服务二进制文件中。例如,以下命令创建了另一个版本的后台处理程序服务,该服务仅在第一个处理器上运行。

instsrv Test c:\util\srvany.exe 
reg add hklm\system\currentcontrolset\services\test\Parameters
reg add hklm\system\currentcontrolset\services\test\Parameters /v Application /t reg_sz /d cmd.exe 
reg add hklm\system\currentcontrolset\services\test\Parameters /v AppParameters /t reg_sz /d "/c start /affinity 1 C:\WINDOWS\system32\spoolsv.exe"

答案2

好的,我根据@Art.Vandelay05的评论进行了补充,以下是(在我看来最直觉的) 解决方案。

  1. Script.ps1使用以下行创建PowerShell 脚本:

    $Process = Get-Process < 服务进程 exe 名称_不包含 exe >
    $Process.ProcessorAffinity = < 处理器亲和性的十六进制位码版本 >
  2. 转到Administrative Tools/Task Scheduler并且Create Task...(不是Create Basic Task
  3. 常规选项卡
    • 无论用户是否登录,都检查运行
    • 更改用户或组到您机器上的本地用户
  4. 触发器
    • 新的...
    • 已启用
    • 开始任务在一次活动中
    • 编辑事件过滤器
    • 使用一点XSLT来找到服务启动的消息。我使用了:

<QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[EventData[Data[@Name="param1"] and (Data="< 你的服务名称 > ")]] and *[EventData[Data[@Name="param2"] and (Data="running")]] </Select> </Query> </QueryList>

  1. 操作
    • 行动启动程序
    • 程序/脚本:执行程序
    • 添加参数(可选):-文件“path_to_script\Script.ps1”

就是这样!现在,每次您的服务运行时,亲和性都会根据您编写的 PowerShell 脚本进行设置。

编辑: 制作当然您的本地用户有权Debug Programs管理工具/本地安全策略/用户权限分配/调试程序/ 将您的本地用户添加到此权限)或您的用户惯于能够改变进程的亲和力。

相关内容