python wmi mac变动_Python WMI参数反转

使用python的wmi模块创建vss快照,我发现除非将它们反向,否则这些参数将不起作用:

importwmidefvss_create():shadow_copy_service=wmi.WMI(moniker='winmgmts:\\\\.\\root\\cimv2:Win32_ShadowCopy')res=shadow_copy_service.Create('ClientAccessible','C:\\')

在msdn docs中,应该以这种方式使用该函数:

Win32_ShadowCopy.Create("C:\\","ClientAccessible");

为什么会这样,有没有办法使用预期的订单?

解决方案

摘要

看起来Wmi对象的方法的参数顺序已被PyWin32层颠倒了,这种现象已经存在至少五年了。相关的wmi规范指出,wmi客户端可以按任何顺序传递参数,因此PyWin32这样做不是“错误”,尽管我无法确定这是故意还是偶然。我推测出于向后兼容的原因,它不太可能更改,但是您可以解决此问题,并通过将其指定为关键字参数来按所需顺序放置参数Create(Volume=, Context=)。

细节

注意在下面的详细信息中,我尝试逐层深入研究,从Python WMI模块代码到PyWin32代码中COM访问的WMI对象,再到其他语言中记录和使用的WMI对象,再到MOF文件指定的WMI对象规范,再到规格文件。有多个层次,我经常写“ WMI”,意思是不同层次上的不同事物。

当您说“ Python的wmi模块”时,您是说Tim Golden的基于PyWin32的Python WMI模块(链接到源代码)吗?

当从wmi模块获取Python WMI对象时,它经过的初始化步骤在类内_wmi_object,包括查询基础wmi对象以获取其可用方法:

forminole_object.Methods_:self.methods[m.Name]=None

我将跳过Python的wmi模块,直接使用PyWin32查看在查询WMI COM对象以获取其可用方法时所得到的结果:

>>>fromwin32com.clientimportGetObject>>>vss=GetObject('winmgmts:\\\\.\\root\\cimv2:Win32_ShadowCopy')>>>[method.Nameformethodinlist(vss.Methods_)][u'Create',u'Revert']

并且我们看到Win32_ShadowCopy对象具有方法Create和Revert。这就是Python wmi包装器首先了解Create您所使用的方法的地方。

从那里开始,Python WMI包装器类完成了一些设置工作,但我没有完全对其进行跟踪,但是它似乎为class _wmi_methodCOM对象的每个可用方法初始化了一次。此类包括以下初始化步骤:

self.method=ole_object.Methods_(method_name)self.in_parameter_names=[(i.Name,i.IsArray)foriinself.in_parameters.Properties_]

列表理解,以获取每种方法的可用参数。回到我的测试以探索没有Python WMI层的情况,它给出的输出如下:

>>>CreateMethod=vss.Methods_('Create')>>>[n.Nameforninlist(CreateMethod.InParameters.Properties_)][u'Context',u'Volume']

此示例测试显示了PyWin32,稍后是Win32_ShadowCopy的COM对象,该Create方法-按照您看到的顺序(“错误”顺序)列出其可用参数。Python WMI层正在接受该排序。

当您Create()通过Python WMI的包装器调用Win32_ShadowCopy对象的方法时,将_wmi_method执行以下操作:

def__call__(self,*args,**kwargs):forn_arginrange(len(args)):arg=args[n_arg]parameter=parameters.Properties_[n_arg]parameter.Value=arg

换一种说法;它将传入(*args)的参数与存储的参数列表一对一地配对,按照传递它们的顺序获取参数,并按WMI返回它们的顺序将它们与方法参数配对-即,它不是智能的,它只需将您输入的第一个参数与“上下文”链接起来,将第二个参数与“音量”链接起来,然后将它们向后移动,代码就会崩溃。

调用方法还包括Python**kwargs参数,该参数接受所有给定的关键字,建议您可以

Create(Volume='C:\\',Context="ClientAccessible")

并通过将它们用作关键字参数将它们按所需的顺序排列。(我没有尝试过)。

我尝试.Properties_通过PyWin32com跟踪查找,以尝试确定从较低层来的顺序,并且它经过一连串的动态查找和缓存查找。我看不到会发生什么,而且我对COM或PyWin32的了解不足,无法知道要寻找什么样的东西,所以这对我来说是死胡同。

采用另一种方法并尝试从WMI对象安装文件中查找顺序的来源:运行mofcomp.exeWindows附带的文件并处理托管对象格式(MOF)文件...单击“连接”,创建类“ Win32_ShadowCopy”;单击方法列表中的“创建”方法,然后单击“编辑方法”按钮;然后单击“编辑输入参数”,然后单击“显示MOF”,并得到以下结果:

[abstract]class__PARAMETERS{[in,ID(0):DisableOverrideToInstance]stringVolume;[in,ID(1):DisableOverrideToInstance]stringContext="ClientAccessible";};

这是Windows MOF文件中参数的“正确”顺序,带有参数的数字ID-表示它们的正确顺序为0、1等。

c:\windows\system32\wbem\vss.mof,似乎覆盖“卷影复制”对象的MOF文件包含以下内容:

[static,implemented,constructor]uint32Create([in]stringVolume,[in]stringContext="ClientAccessible",[out]stringShadowID);

MSDN链接的注释中的PowerShell示例包括$class.create("C:\", "ClientAccessible")。

因此,这三件事都以相同的顺序捆绑在一起,并暗示存在正确或标准的顺序。

这让我想到了这些可能性:

有一些订购信息是从PythonCOM发出的,而wmi模块应该查看它,但是没有。-我快速浏览了一下,找不到带有参数列表的ID /订购数据,因此似乎不太可能。

PyWin32 COM层应该查看但我不知道的某个地方有订购信息。-不确定这里。

没有官方订购。为了确认这一点,我们得到了一个有趣的链条:

什么是WMI?DTMF指定的Microsoft标准管理框架WBEM和CIM的实现。(DTMF =分布式管理工作组,WBEM是基于Web的企业管理,CIM是公共信息模型)。

MOF是托管对象格式,是CIM的文本表示形式

570行:

“一种方法可以具有零个或多个参数”。

626至628行:

方法参数是通过名称而不是位置来标识的,并且调用方法的客户端可以按任何顺序传递相应的参数。因此,可以在任何位置将具有默认值的参数添加到方法签名中。

我不确定这是否是权威性的最新规范,也无法阅读所有的规范以查找异常,但是听起来您应该使用命名参数。

WMI对象和方法具有MOF定义,并且MOF规范指出您不应依赖参数排序。但是,通过PyWin32通过COM访问WMI对象显示了不同的顺序(MSDN文档,MOF文件和PowerShell示例)。我仍然不知道为什么。

而谷歌搜索这 使我这个添金,Python的WMI模块的作者的邮件列表的帖子,他说基本上是相同的事情我只是发现,除五年前:

方法定义按照WMI返回它们的顺序来拾取参数[..]我不知道是否有关于参数[..]顺序的任何保证,看上去还有其他一些方法定义,好像WMI始终按照MOF中定义的相反顺序返回参数。

在这一点上,PyWin32似乎将反向列表返回到典型的Windows参数顺序,但是如果CIM受管对象方法参数列表规范文档明确表示不依赖参数顺序,那是否是一个bug?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 HDU - 2594 】Simpsons’ Hidden Talents(KMP应用,求最长前缀后缀公共子串)

题干: Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I take…

python两次调用write连续写入的数据之间_两次调用文件的write 方法,以下选项中描述正确的是...

两次调用文件的write 方法,以下选项中描述正确的是答:连续写入的数据之间无分隔符中国大学MOOC: 斜弯曲、拉(压)弯曲组合变形的危险点都是单向应力状态。答:对急性宫外孕破裂或的最主要症状是答:突然一侧下腹部撕裂样疼痛Some thi…

拉格朗日差值 - 杜教板子

牛客网暑期ACM多校训练营(第一场) F Sum of Maximum 杜教板子&#xff1a; 证明https://blog.csdn.net/Lee_w_j__/article/details/81135539 #include <cstdio> #include <iostream> #include <vector> #include <cstring> #include <algorithm&…

python归并排序 分词_python实现归并排序,归并排序的详细分析

学习归并排序的过程是十分痛苦的。它并不常用&#xff0c;看起来时间复杂度好像是几种排序中最低的&#xff0c;比快排的时间复杂度还要低&#xff0c;但是它的执行速度不是最快的。很多朋友不理解时间复杂度低为什么运行速度不一定快&#xff0c;这个不清楚的伙伴可以看下我之…

CCFCSP 2018年9月 -- 部分题目

CCF201809 -- 第一题 &#xff1a;买菜 问题描述   在一条街上有n个卖菜的商店&#xff0c;按1至n的顺序排成一排&#xff0c;这些商店都卖一种蔬菜。   第一天&#xff0c;每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致&#xff0c;第二天…

servlet中显示mysql字段_Java Servlet:从数据库获取信息并在屏幕上显示它

创建它代表了表的每一个项目(行)一个JavaBean类。创建一个使用JDBC返回这些项目列表的DAO类。然后在servlet中&#xff0c;只需使用HttpServletRequest#setAttribute()将请求范围中的项目列表&#xff0c;使用RequestDispatcher#forward()将请求转发到JSP文件&#xff0c;并使用…

【CodeForces - 689B】Mike and Shortcuts(Dijkstra最短路,或者bfs跑状态类似spfa)

题干&#xff1a; Recently, Mike was very busy with studying for exams and contests. Now he is going to chill a bit by doing some sight seeing in the city. City consists of n intersections numbered from 1 to n. Mike starts walking from his house located a…

sqlserver mysql分页_SQLServer与MySQL中分页查询sql语句示例

/***author blovedr*功能&#xff1a;SQLServer与MySQL中分页查询sql语句示例*日期&#xff1a; 2018年8月17日 10:58*注释&#xff1a; 学习数据库MySQL的点点记录&#xff0c; 谢谢网上各位大神分享经验与资料&#xff0c; 欢迎大神批评与交流。*/分页查询 2018.8.16 …

【51Nod - 1103】N的倍数 (思维,鸽巢原理也叫抽屉定理,求倍数问题取模)

题干&#xff1a; 一个长度为N的数组A&#xff0c;从A中选出若干个数&#xff0c;使得这些数的和是N的倍数。 例如&#xff1a;N 8&#xff0c;数组A包括&#xff1a;2 5 6 3 18 7 11 19&#xff0c;可以选2 6&#xff0c;因为2 6 8&#xff0c;是8的倍数。 Input 第1行…

java位操作_关于java按位操作运算

<1>.在了解位移之前&#xff0c;先了解一下正数和负数的二进制表示形式以及关系&#xff1a;举例15和-15&#xff1a;15 的原码&#xff1a; 00000000 00000000 00000000 00001111补码&#xff1a; 11111111 11111111 11111111 111100001 -15的原码&#xff1a;11111111 …

【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)

题干&#xff1a; 一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN&#xff08;1 < L1,L2,…,LN < 1000&#xff0c;且均为整数&#xff09;个长度单位。我们认为切割时仅在整数点处切且没有木材损失。 木匠发现&#xff0c;每一次切割花费的体…

java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...

展开全部方法如下&#xff1a;Random rannew random();boolean flagtrue;while(flag){int aran.nextInt(99999999);int bran.nextInt(99999999);long ca*100000000Lb;if(c>1000000000000000L&&c<9999999999999999L){flagfalse;c1c;String numString.valueOf(c1);…

java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312

java跟python类似的做法&#xff0c;在java中字符串的编码是java修改过的一种Unicode编码&#xff0c;所以看到java中的字符串&#xff0c;心理要默念这个东西是java修改过的一种Unicode编码的编码。packagestring;importjava.nio.charset.Charset;public classUTF82GBK {publi…

【CodeForces - 760B 】Frodo and pillows (二分题意,注意细节)

题干&#xff1a; n hobbits are planning to spend the night at Frodos house. Frodo has n beds standing in a row and m pillows (n ≤ m). Each hobbit needs a bed and at least one pillow to sleep, however, everyone wants as many pillows as possible. Of cour…

eclipse wsdl2java_使用Eclipse的wsdl2java工具

一、用Eclipse调用Axis的wsdl2java1.在eclipse里面新建一个项目或已有的项目&#xff1b;2.导入activation.jaraxis.jarcommons-discovery.jarcommons-logging-1.0.3.jarjaxrpc.jarsaaj.jarwsdl4j-1.5.2.jar包3右击你的工程&#xff0d;Run As&#xff0d;Run...&#xff0d;右…

【POJ - 2785】4 Values whose Sum is 0 (二分,折半枚举)

题干&#xff1a; The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a b c d 0 . In the following, we assume that all lists have the same…

java好的博客_推荐5个万博爆款Java开源博客,是我目前用过最好用的博客系统

1.OneBlog一个简洁美观、功能强大并且自适应的Java博客&#xff0c;使用springboot开发&#xff0c;前端使用Bootstrap&#xff0c;支持移动端自适应&#xff0c;配有完备的前台和后台管理功能。功能简介多种编辑器、自动申请友情链接、百度推送、评论系统、权限管理、SEO、实时…

【UVALive - 3126】Taxi Cab Scheme (二分图,最小路径覆盖)

题目大意&#xff1a; 有n个出车安排&#xff0c;一辆车能接到这个安排的条件是&#xff1a;1、这辆车第一次发车&#xff1b;2、这辆车接了上一个安排&#xff0c;回到这个安排的起点的时间正好是这个安排的前一分钟或者更早 解题报告&#xff1a; 建图然后跑最小路径覆盖。…

java await signal_Java中的await()/signal()用法

二、方法await()/signal()在JDK5.0以后&#xff0c;JAVA提供了新的更加健壮的线程处理机制&#xff0c;包括了同步、锁定、线程池等等&#xff0c;可以实现更小粒度上的控制。await()和signal()就是其中用来同步的两种方法&#xff0c;功能基本上和wait()/notify()相同&#xf…

【HDU - 1083 】Courses (二分图)

题干&#xff1a; Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions:…