删除Windows性能计数器类别

时间:2020-03-06 14:47:27  来源:igfitidea点击:

我有一个自定义性能计数器类别。 Visual Studio Server Explorer拒绝删除它,声称它"未注册或者系统类别"。缺少以编程方式进行的操作,如何删除类别?有可以删除的注册表项吗?

解决方案

据我所知,除了以编程方式(它们是供应用程序在安装过程中创建和删除的)以外,没有其他方法可以安全地删除它们,但是在PowerShell命令行控制台中却是微不足道的。只需运行以下命令:

[Diagnostics.PerformanceCounterCategory]::Delete( "Your Category Name" )

但是:(编辑)

我们可以删除创建的注册表项,这将使类别消失。

对于名为"库存"的类别,我们可以在HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Inventory中删除整个键...尽管我不愿意打赌清理所有内容,但它将使类别消失。 (如果在运行Delete()方法的同时运行Process Monitor,则可以看到是否发生了许多其他活动,并且似乎没有进行任何其他更改)。

请务必注意,正如我最初所说的那样:当我们从Visual Studio中收到该错误时,可能是它已被删除,我们需要在VS中刷新视图。在测试中,我必须重新启动应用程序才能使它们真正获得可用类别的完整列表。

我们可以从PowerShell中检查类别的完整列表,以查看是否列出了该类别:

[Diagnostics.PerformanceCounterCategory]::GetCategories() | Format-Table -auto

但是,如果我们检查它们,然后删除注册表项...它们仍会显示,直到重新启动PowerShell(如果我们启动另一个实例,则可以在该实例上运行相同的查询,并且不会显示已删除的项目,但是在第一个中重新运行GetCategories将继续显示它。

顺便说一句,如果要对样式使用-like或者对完整正则表达式使用-match,则可以过滤该列表:

[Diagnostics.PerformanceCounterCategory]::GetCategories() | Where {$_.CategoryName -like "*network*" } | Format-Table -auto
[Diagnostics.PerformanceCounterCategory]::GetCategories() | Where {$_.CategoryName -match "^SQL.*Stat.*" } | Format-Table -auto

我们可以使用Microsoft资源工具包工具禁用它,方法是从

http://download.microsoft.com/download/win2000platform/exctrlst/1.00.0.1/nt5/en-us/exctrlst_setup.exe

或者手动从注册表中禁用它(未尝试过),如此处所述

http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/regentry/94214.mspx?mfr=true

我们也可以使用LinqPad,因为它不涉及任何形式的http://www.linqpad.net/的安装。

将以下代码作为" CStatement(s)"运行:

`System.Diagnostics.PerformanceCounterCategory.Delete("要删除的类别名称");

我已经运行了两次,第一次是执行实际的删除,第二次是收到一条错误消息,以确认删除成功。