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

[玩转系统] 周五乐趣:列出 WMI 命名空间

作者:精品下载站 日期:2024-12-14 07:51:06 浏览:16 分类:玩电脑

周五乐趣:列出 WMI 命名空间


[玩转系统] 周五乐趣:列出 WMI 命名空间

WMI 命名空间就像相关类的容器。命名空间本身可以通过系统类名 __namespace 来定义。名字前面有两个下划线。您可以像任何其他类名一样使用该名称。

[玩转系统] 周五乐趣:列出 WMI 命名空间

因此,这些将是我的 Windows 10 系统上默认 root\cimv2 命名空间下的子命名空间。当然,您可以指定不同的命名空间。顶层命名空间称为根命名空间。

[玩转系统] 周五乐趣:列出 WMI 命名空间

当然,我可以对远程计算机做同样的事情。

[玩转系统] 周五乐趣:列出 WMI 命名空间

有趣的部分在于递归这些命名空间。为此,我们需要为每个新名称空间构建一个命名空间来重复此命令。这就是我们需要一个函数的地方,您可以在我的 GitHub 存储库中找到该函数的要点。

https://gist.github.com/jdhitsolutions/3f98b8f31d423e5fee49279a20652707

该函数有 2 个部分。有一个名为 _EnumNamespace 的内部私有函数。这完成了列出名称空间并递归每个子名称空间的实际工作。

$nspaces = Get-CimInstance @cimInst

Write-Verbose "[$((Get-Date).timeOfDay)] Found $($nspaces.count) namespaces under $namespace"
if ($nspaces.count -gt 0) {
    foreach ($nspace in $nspaces) {
        Write-Verbose "[$((Get-Date).timeOfDay)] Processing $($nspace.name)"
        $child = Join-Path -Path $Namespace -ChildPath $nspace.Name
        [pscustomobject]@{
            Computername = $nspace.cimsystemproperties.servername
            Namespace = $child
        }
        if ($recurse -and $CimSession) {
            Write-Verbose "[$((Get-Date).timeOfDay)] Recursing and re-using cimsession" 
            _EnumNamespace -namespace $child -Recurse -CimSession $cimSession
        }
        elseif ($recurse) {
            Write-Verbose "[$((Get-Date).timeOfDay)] Recursing" 
            _EnumNamespace -namespace $child -Recurse
        }
    } #foreach

当我构建这个函数时,我自然希望能够查询远程计算机。我还希望能够支持备用凭据。我知道无论如何我都会在函数内创建一个 CimSession,以便每个递归查询都可以重复使用该会话。

棘手的部分是最后清理会话。无法知道任何类型的递归何时完成,因此我创建了一个 shell 函数,它作为用户的主要命令。参数被传递给私有函数,当私有函数完成时,shell 函数可以清理 CimSession。

以下是该功能的一些实际操作截图。

[玩转系统] 周五乐趣:列出 WMI 命名空间

[玩转系统] 周五乐趣:列出 WMI 命名空间

您甚至可以使用此函数来发现类。

[玩转系统] 周五乐趣:列出 WMI 命名空间

这也许不是最好的方法,因为 Get-CimClass 正在创建新的 CimSession,但您明白了。

我希望您能尝试一下,并让我知道您发现了哪些有趣或有用的 WMI 精彩之处。

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

取消回复欢迎 发表评论:

关灯