ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15827|回复: 9

[求助] winmgmts:是什么意思

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-11-20 09:52 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:WMI应用

GetObject("winmgmts:\\.\root\cimv2")

在微软的脚本中心里面看到这段代码

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer _
    & "\root\cimv2\Applications\ Microsoft IE")
Set colIESettings = objWMIService.ExecQuery _
    ("Select * from  Microsoft IE_Security")
For Each strIESetting in colIESettings
    Wscript.Echo "Zone name: " & strIESetting.Zone
    Wscript.Echo "Security level: " & strIESetting.Level
Next

说是可以枚举IE安全设置,看不懂啊。谁可以解释一下

[此贴子已经被作者于2006-11-20 9:52:56编辑过]

TA的精华主题

TA的得分主题

发表于 2006-11-20 10:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-11-20 10:09 | 显示全部楼层

The "WinMgmts:" Prefix

Microsoft® Windows® 2000 Scripting Guide

WMI monikers can consist of three parts: one mandatory component and two optional components. The mandatory component is the "winmgmts:" prefix. All WMI monikers must begin with "winmgmts:" as shown here:

Set objSWbemServices = GetObject("winmgmts:")

The moniker in this code is the string "winmgmts:", which is passed to the GetObject function. Although in this example the string is entered using all lowercase letters, you can use whatever case you like; that is, "WinMgmts:", "WINMGMTS:", and "winmgmts:" all produce the same result.

Specifying a moniker that consists only of the "winmgmts:" prefix is the most basic form of WMI moniker you can use. The result is always a reference to an SWbemServices object, which represents a connection to the Windows Management Instrumentation service on the local computer. Under the covers, the "winmgmts:" moniker:

1.

Retrieves the WMI CLSID from the registry subkey HKCR\WINMGMTS\CLSID. The CLSID ({172BDDF8-CEEA-11D1-8B05-00600806D9B6}) is the identifier used by the operating system to map WMI to the appropriate COM object.

2.

Retrieves the value from a second registry entry, HKCR\CLSID\{172BDDF8-CEEA-11D1-8B05-00600806D9B6}\InProcServer32. This value (typically C:\Windows\System32\wbem\wbemdisp.dll) indicates the path to the COM object that exposes the SWbemServices object.

3.

Loads Wbemdisp.dll, the DLL containing the WMI scripting library that exposes SWbemServices.

After you have obtained a reference to SWbemServices, you can then invoke one of the object methods as shown here:

Set objSWbemServices = GetObject("winmgmts:")
Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_LogicalDisk")

In this example, a reference variable named objSWbemServices is initialized using the "winmgmts:" moniker. This reference variable is subsequently used to invoke the InstancesOf method provided by the SWbemServices object.

Although the preceding example is perfectly acceptable, you do not have to use two lines of code to retrieve all Win32_LogicalDisk instances. This can also be done with the following single line of script:

Set colSWbemObjectSet = GetObject("winmgmts:").InstancesOf("Win32_LogicalDisk")

In this case, a user-defined variable (objSWbemServices in the example preceding this one) is not used to explicitly reference the SWbemServices object commonly returned by GetObject and the WMI moniker. Instead, the "winmgmts:" moniker creates an SWbemServices reference in memory and immediately uses the unnamed, memory based reference to call the SWbemServices InstancesOf method.

In the end, both examples produce identical results in the form of an SWbemObjectSet collection containing all instances of the Win32_LogicalDisk class on the local computer. You can also call the ExecQuery method or any other method provided by the SWbemServices object. In fact, if the objective of your script is to simply enumerate and echo all Win32_LogicalDisk instances, you can get by with as little as the following:

For Each objDisk In GetObject("winmgmts:").InstancesOf("Win32_LogicalDisk")
    Wscript.Echo objDisk.DeviceID
Next

In this case, user-defined variables are not used to reference SWbemServices or SWbemObjectSet. Both objects are still created, but only in memory and without an explicit object reference. By using the most basic WMI moniker, and by understanding the relationship of the moniker with the WMI scripting library, you can begin to construct concise yet powerful WMI statements.

先剪下来,等会再看

,谢谢啊
[此贴子已经被作者于2006-11-20 10:09:24编辑过]

TA的精华主题

TA的得分主题

发表于 2006-11-20 10:27 | 显示全部楼层
利用WMI获取系统信息
    WMI(Windows Management Instrumentation)技术是微软提供的Windows下的系统管理工具。
通过该工具可以在本地或者管理客户端系统中几乎一切的信息。很多专业的网络管理工具都是
基于WMI开发的。该工具在Win2000以及WinNT下是标准工具,在Win9X下是扩展安装选项。本文
将介绍如何通过VB编程来访问WMI对象的编程。

   首先来看一个简单的通过WMI获取系统信息的范例,这个范例通过WMI对象获得系统中运行
的的进程:

Function Enum1() As String
    Dim WMI

    Set WMI = GetObject("WinMgmts:")
    Set objs = WMI.InstancesOf("Win32_Process")

    For Each obj In objs
        Enum1 = Enum1 + obj.Description + Chr(13) + Chr(10)
    Next
End Function

    在上面的代码中,首先通过  GetObject("WinMgmts:")获得WMI对象,在WMI对象下有很多的
子项,在这里我们通过WMI.InstancesOf("Win32_Process")获得系统中所有的进程列表子项。

    下面看一个完整的访问WMI对象的范例,这个范例获得计算机的信息。
    建立一个新工程,在Form1中添加一个TextBox控件以及一个CommandButton控件,在
CommandButton的Click事件中写入以下的代码:


Private Sub Command1_Click()
    Dim s, System, item
    Dim i As Integer

    Set System = GetObject("winmgmts:").InstancesOf("Win32_ComputerSystem")
    For Each item In System
        'List1.AddItem item.cputype
        s = "Computer Info" & vbCrLf
        s = s & "***********************" & vbCrLf
        s = s & "计算机名称: " & item.name & vbCrLf
        s = s & "状态: " & item.Status & vbCrLf
        s = s & "类型: " & item.SystemType & vbCrLf
        s = s & "生产厂家: " & item.Manufacturer & vbCrLf
        s = s & "型号: " & item.Model & vbCrLf
        s = s & "内存: ~" & item.totalPhysicalMemory \ 1024000 & "mb" & vbCrLf
        s = s & "域: " & item.domain & vbCrLf
        's = s & "工作组" & item.Workgroup & vbCrLf '获得工作组和域的选项不能同时用

        s = s & "当前用户: " & item.username & vbCrLf
        s = s & "启动状态" & item.BootupState & vbCrLf
        s = s & "该计算机属于" & item.PrimaryOwnerName & vbCrLf
        s = s & "系统类型" & item.CreationClassName & vbCrLf
        s = s & "计算机类类型" & item.Description & vbCrLf

        For i = 0 To 1  '这里假设安装了两个系统
            s = s & Chr(5) & "启动选项" & i & " :" & item.SystemStartupOptions(i) _
                & vbCrLf
        Next i
    Next

    Text1.Text = s
End Sub

    运行程序,点击Command1,在textBox中就可以显示计算机的信息。

    在上面的代码中,程序通过GetObject("winmgmts:")获得WMI对象,然后获得下面的
Win32_ComputerSystem子项并通过访问Win32_ComputerSystem对象中的分项获得系统中的信息。
需要说明的是,并不是所有的系统都支持WMI,在有些系统中无法显示生产厂家等信息。


    现在的计算机以及网络组成十分复杂。例如系统硬件方面就有主板、硬盘、网卡... 。
软件方面有操作系统、系统中安装的软件、正在运行的进程等等。网络方面有域、工作组
等等。利用WMI可以访问上面的全部信息,但是如果向上面一样的利用分项来访问的话会很
麻烦。为此,WMI提供了一种类似SQL语句的查询语句,可以通过查询语句获得WMI对象下的子项。



    下面是一个遍历系统中安装的网卡并返回网卡MAC地址的代码:


Private Function MACAddress() As String

   Set objs = GetObject("winmgmts:").ExecQuery( _
      "SELECT MACAddress " & _
      "FROM Win32_NetworkAdapter " & _
      "WHERE " & _
      "((MACAddress Is Not NULL) " & _
      "AND (Manufacturer <> " & _
      "'Microsoft'))")

   For Each obj In objs
      MACAddress = obj.MACAddress
      Exit For
   Next obj
End Function

    上面的代码获得WMI对象,然后运行ExecQuery执行一个WMI查询语句获得安装的网卡并返回
网卡的MAC地址。

    WMI还支持事件处理,让程序可以处理系统事件,例如程序运行、关闭,可移动驱动器的插入、
取出等。下面是一个可以对系统中运行程序进行监控的程序。
    首先建立一个新工程,然后点击菜单的 project | references 项,在references列表中选中
Microsoft WMI Scripting Library将WMI对象库加入工程中。然后在Form1中加入一个ListBox控件,
然后在Form1中加入以下代码:


Option Explicit


Dim Locator As SWbemLocator
Dim Services As SWbemServices
Dim WithEvents StatusSink As SWbemSink

Private Sub KillEvents()
    StatusSink.Cancel
    Set StatusSink = Nothing
End Sub

Private Sub Form_Load()
    Dim Query As String

    Set StatusSink = New SWbemSink
    Set Locator = CreateObject("WbemScripting.SWbemLocator")
    Set Services = Locator.ConnectServer()

    Query = "SELECT * FROM __InstanceCreationEvent "
    Query = Query + "WITHIN 1 "
    Query = Query + "WHERE TargetInstance ISA 'Win32_Process'"

    Services.ExecNotificationQueryAsync StatusSink, Query
End Sub


Private Sub StatusSink_OnObjectReady(ByVal StatusEvent As SWbemObject, _
                                     ByVal EventContext As SWbemNamedValueSet)

    Dim arr
    Dim strQue As String
    Dim i As Integer

    List1.Clear
    arr = Split(StatusEvent.GetObjectText_, Chr(10))
    For i = LBound(arr) To UBound(arr)
        List1.AddItem arr(i)
    Next i
End Sub


Private Sub StatusSink_OnCompleted(ByVal HResult As WbemErrorEnum, _
                                   ByVal ErrorObject As SWbemObject, _
                                   ByVal EventContext As SWbemNamedValueSet)

    If HResult <> wbemErrCallCancelled Then
        '错误处理
    End If
End Sub



    在上面的程序中定义了一个SWbemSink对象StatusSink,然后建立一个SWbemServices对象Server,
并将StatusSink连接到Server对象上。这样就可以通过StatusSink监控程序的运行。
    运行程序,然后任意运行一个程序,在Form1的ListBox中就可以列出运行的程序的信息。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-11-20 10:53 | 显示全部楼层

WMI脚本高手不完全手册

2006-10-08 12:02:39 / 天气: 晴朗 / 心情: 高兴 / 个人分类:网络安全

要成为WMI脚本高手当要认识一下什么叫WMI啦,下面将介绍一下有关WMI的东西。
Windows 管理规范(Windows Management Instrumentation)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。WMI 通过编程和脚本语言为日常管理提供了一条连续一致的途径。用户可以:
1.在远程计算机器上启动一个进程。
2.设定一个在特定日期和时间运行的进程。
3.远程启动计算机。
4.获得本地或远程计算机的已安装程序列表。
5.查询本地或远程计算机的 Windows 事件日志。
而WMI适用的运得环境也是有些限制的,WMI 适用于所有最新版本的 Windows。WMI 附带在 Windows Me、Windows 2000、Windows XP 和 Windows Server 2003 之中。
对于 Windows 98 和 Windows NT 4.0,可以访问http://www.microsoft.com/downloads并搜索“Windows Management Instrumentation (WMI) CORE 1.5 (Windows 95/98/NT 4.0)”。
注意:在 Windows NT 4.0 上安装并运行 WMI 之前,需要首先安装 Service Pack 4 或更高版本。
WMI 需要的其他软件包括:
1. Microsoft Internet Explorer 5.0 或更高版本。
2. Windows script Host(WSH)。Windows 2000、Windows XP、Windows Server 2003、和 Windows Me 附带的 WSH,而不是 Windows NT4 或 Windows 98 附带的 WSH。您可以从以下地址下载 WSH http://www.microsoft.com/downloads. WSH 的最新版本—— 包括在 Windows XP 和 Windows Server 2003 之中——是 WSH 5.6。
要使WMI脚本可以正常的运行,Windows里的WMI 服务(winmgmt)保证是运行的,这样才可以实现WMI里的更多功能。
好了,关于WMI的一些基本的信息资料就说到这,要想看更多的可以到MicroSoft网站的MSDN找。下面就简单的讲一下WMI脚本编写的基本要素,看看下面的代码:
//这个脚本是查看系统启动的引导配置参数,下面我们来看看关于WMI脚本编写的架构。
On Error Resume Next
//下面这行是比较重要的,它定义了主机的变量,可以是本机或远程主机,域上的机等,参数英文的“.”是表示本机,要想实现其它机的可以填上其它机的主机名或IP。
strComputer = "."
//下面这行是通过GetObject得到主机的WMI对象管理空间“\root\cimv2”,如果是本机的是通过NT(Authentication)认证的,所以可以不用用户名和密码,而对于非本机或非域机的就要再加多几条参数,
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
//执行WMI数据对象的查询
//至于连接远程的要用下面的语句
Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
Set objService = objLocator.ConnectServer(strComputer, "root\cimv2", "administrator", "a")
Set colItems = objWMIService.ExecQuery("Select * from Win32_BootConfiguration",,48)


//利用数组列出相关
For Each objItem in colItems
Wscript.Echo "BootDirectory: " & objItem.BootDirectory
Next
从上面的例子可以看出写一个WMI的要求:
1.得到主机的WMI对像管理空间
2.执行WMI数据对象的查询
3.利用数组列出相关
学习编写的架构并不难,只要练多几次就行了,但是学习WMI的第一个难题就是它的子集对象,因为我们并不知道它的子集对象是什么,这样写起程序来就会力不从心了。要一下子知道这样子集的对象也是不难的,只要在MicroSoft的MSDN找找会有不少,但是这样找下去的话可能要找很久或资料不够全,是不是有些难呢?其实MicroSoft公司的网站上有一个叫“scriptomatic”的工具,才100多K,解压后你们发觉真正有用的是那个才12k的“scriptomatic.hta”文件,双击打开后你会发觉是一个子集的数据列表,且还有例子呢。


以上就是查询“Win32_BIOS”里的子集参数,是不是很易实现WMI脚本的编写呢?
朋友们,可曾记得大半年前是不是有一个这样的漏洞:就是一个GUEST用户权限可以用WMI的脚本实现加账号的例子,其实就是一个WMI 命名空间的安全性出现问题。下面我们打开计算机上的MMC看看如何设置WMI的安全权限。
在运行菜单上打“MMC”,然后在“文件”菜单上选“添加/删除管理单元”,然后在“独立”的选项卡(默认)上按“添加”,之后来到“添加独立管理单元”列表。
然后就一路按“添加”、“确定”就可以了。返回到MMC的主介面上,然后右击“WMI”单元选“属性”。
在WMI控件属性对话框中单击安全选项卡。
一个名为Root,前面带加号(+)的文件夹将会出现。如果必要,展开这个树状结构,定位到想要设置权限的命名空间。
单击安全设置按钮。一组用户和权限显示出来。如果用户在这个列表中,请按照需要修改权限。如果用户不再这个列表中,请单击 添加 按钮,然后从账户所在的位置(本地计算机、域等等)添加用户。
小提示:
为了查看和设置 NameSpace 安全性,用户必需拥有读取安全设置 和 编辑安全设置 权限。系统管理员默认具备这些权限,并可以按照需要将权限赋予其他用户如果一个用户需要远程访问命名空间,必须为其选中远程启用权限。
默认情况下,针对一个命名空间设置的用户权限只对该命名空间有效。如果希望用户可以访问该命名空间和其下所有子命名空间,或者只能访问子命名空间,请单击高级按钮。单击编辑并在出现的对话框中指定允许访问的范围。这样就可以防止此类事情的发生,但是透过此类的WMI命名空间的安全设置,也可以成为黑手会配置后门的地方,所以在架建一个安全的系统,这里不能不看。今天的WMI技术就介绍到这里,文章写得有些仓促,难免有问题,请各位多多指点小弟。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-11-20 10:55 | 显示全部楼层

微软提供的好东西啊,有了他用VBA几乎可以访问一切的系统对象了。

看了脚本东西上的程序,居然还有用他判断计算机机箱类型的,昏……

不过,我们论坛上讨论他的东西实在太少了,网上招到的资料大都是从黑客技术网站上流传出来的。

[此贴子已经被作者于2006-11-20 10:57:16编辑过]

TA的精华主题

TA的得分主题

发表于 2010-10-23 17:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-2-1 14:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
makr  .....

TA的精华主题

TA的得分主题

发表于 2018-11-9 13:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-7-7 21:28 | 显示全部楼层
此贴不知何年发,今始初读方觉醒!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-18 21:25 , Processed in 0.054212 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表