使用Service Start运行PowerShell脚本

我想在启动时设置一个服务进程的AffinityPriority无需修改服务/进程代码,我拥有代码,这是第三方服务)。

我知道我可以这样做:

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

PowerShell中更改进程的相关性或在命令path前加上:

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

但是,这些都不适用于每次启动服务时自动更改服务的进程的相关性和Priority )如何在使用某些第三方应用程序的情况下重新启动时保持进程亲和性(我真的很喜欢自己编写/创build一个解决scheme,而不是依靠另一个应用程序来“configuration”窗口)。

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

如果你想控制一个服务,你可以使用instsrv / srvany来创build一个服务,在真正的服务二进制文件中包装start或者psexec命令。 例如,下面的命令创build只能在第一个处理器上运行的后台打印程序服务的另一个版本。

 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" 

好吧,我build立在@ Art.Vandelay05的评论和这里(恕我直言最直观 )的解决scheme。

  1. 使用以下几行创buildScript.ps1 PowerShell脚本:

    $Process = Get-Process <service_process_exe_name_WITHOUT_the_exe>
    $Process.ProcessorAffinity = <处理器关联的位代码的hex版本>

  2. 转到Administrative Tools/Task SchedulerCreate Task... (不要Create Basic Task
  3. 常规选项卡
    • 检查运行用户是否login
    • 将用户或组更改为您计算机上的本地用户
  4. 触发器
    • 新…
    • 启用
    • 开始任务在一个事件
    • 编辑事件筛选器
    • 使用一点XSLT来查找服务启动的消息。 我用了:

<QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[EventData[Data[@Name="param1"] and (Data=" <your_service_name> ")]] and *[EventData[Data[@Name="param2"] and (Data="running")]] </Select> </Query> </QueryList>

  1. 操作
    • 行动开始一个程序
    • 程序/脚本: PowerShell.exe
    • 添加参数(可选): – 文件“path_to_script \ Script.ps1”

而已! 现在,每次运行服务时,亲和力都将根据您所写的PowerShell脚本进行设置。

编辑: 确保你的本地用户有Debug Programs权限( pipe理工具/本地安全策略/用户权限分配/debugging程序/添加您的本地用户到这个权利),否则您的用户将无法改变进程的亲和力。