MicrosoftWindowsManagementInstrumentation(WMI)。中文名字叫Windows管理规范。从Windows2000开始,WMI(Windows管理规范)就内置于操作系统中,并且成为了Windows系统管理的重要组成部分。所以大家很容易就能见到它的,因为我们至少也应该是个Windows2000的使用者了。下面我将详细介绍它的每个细节,让你从不认识它到喜欢上它。

WMI能做什么?

WMI不仅可以获取想要的计算机数据,而且还可以用于远程控制。远程控制计算机可是大家都喜欢的东西。很多远程监视控制类软件通常的做法是:在远程计算机上运行服务端后台程序,在本地计算机上运行一个客户器端控制程序,通过这二个程序的勾结来实现对计算机的远程控制。这种作法的缺点是十分明显的,当服务端程序关了,这种远程监控就无法实现了,因为没有内线了。而WMI实现的远程监视和控制完全不需要另外装什么服务端的东西,系统默认就将WMI服务给开了。具体说来,WMI的本领如下:

1.获取本地和远程计算机的硬件软件信息。

2.监视本地和远程计算机的软件和服务等运行状况。

3.控制本地和远程计算机的软件和服务运行。

4.高级应用。

如何访问WMI?

当我们知道WMI的某些本领后,我们已经很想知道如何认识他并利用他了。利用WMI有许多途径,简单说来有三种了:

1.通过微软给我们提供的各种工具来实现普通查询和操作。主要包括命令提示符下面的WMIC,还有就是微软给我们提供的WMITOOL,大家可以到微软的网站上免费下载,当然我也可以给大家免费提供。

2.通过自己编写脚本来实现更灵活操作。要想真正灵活实用,对WSH脚本的熟悉是必须的,当然如果你不熟悉也没有关系,稍后我会给大家详细解释的。

3.通过编写我们自己的程序来访问并操作它。什么语言都行。如果用.NET类程序要简单些了,如果用VC等要复杂些了,起码我是这么认为的。

4.还有个访问它的方法,就是到它的一个巢穴。在C:\WINDOWS\syst通过WMIC命令远程打开远程计算机的远程桌面(Remote Desktop)功能 - 如云草 - 如云草的博客\wbem目录中的东西都和它有密切联系,有日志和各种工具,在里面你可以找到很多答案的。不过这些东西一般都不适合我们新手玩了,感觉有点吓人。

我们今天的任务?

今天我们的任务有五个:

任务一:利用WMIC列出远程计算机上的所有进程。

任务二:利用WMIC关闭本地进程。

任务三:通过WMIC把远程主机的进程信息保存在一个网页中

任务四:利用脚本实时监视对方进程

任务五:利用脚本给对方开放共享

查看和监视进程,还要把进程给杀掉,最后还要给对方开个共享,我们这位朋友快把坏事做尽了。明白了我们的任务,我们就可以上路了。这次我们将主要借助WMIC和脚本来实现我们的任务,所以我们将主要分为两大部分来讲解。在五个任务的实战中我们将更加深入地理解它,没有基础没有关系,我将尽力去解释所有的所谓的基础,让大家能很轻松地和这位朋友交流。

第一部分:利用WMIC来认识WMI

WMIC是WindowsManagementInstrumentationCommandline的简称,WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。为WMI名称空间提供了一个强大的、友好的命令行接口。有了WMIC,WMI就显的平易近人了。

执行“WMIC”命令将启动WMIC命令行环境。第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在WMIC命令行提示符上,命令将以交互的方式执行。如果你不知道该如何和它交互,请敲个“/?”,细细看完全部的说明,你就知道了。WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务,或者运行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在同一个命令行上启动WMIC并输入要执行的命令就可以了。

1.任务一:利用WMIC列出远程计算机上的所有进程

这是一个实现起来很简单的任务,和你用一个DOS命令一样简单,因为我们要循序渐进嘛,所以安排了这么一个热身任务。在命令提示符下敲入下面的命令,我们将看到。

WMIC/node:192.168.1.2/user:netprocess

解说:

1)上面命令中的NODE和USER是全局开关。如果你不愿意另外输一次密码,你也可以用PASSWORD开关,后面写上密码就可以了(WMIC/node:192.168.1.2/user:net/password:passwordprocess)。千万要注意,这里的用户名和密码都必须是管理员级别的,其它的无效。WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是用来配置整个WMIC会话的选项。

2)Process是个别名,执行了一个Win32_process类的WQL查询,至于说是WMI的类是什么东西,感兴趣的就自己找资料多多了解,如果你很懒的话,就等我有时间给你开课讲解。别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时,动词(Verb)表示要执行的动作。

3)如果你愿意,你可以在该后面加上个动词等,比如LISTFULL等(如:WMIC/node:192.168.1.2/user:net/password:passwordprocess),这样你就看得更清楚了。

小提示:安装了WMIC的机器可以连接到任何一台安装了WMI的机器,被连接的机器不需要安装WMIC。

2.任务二:利用WMIC关闭本地进程

执行下面的命令将关闭正在运行的QQ。我比较胆小,所以不敢关别人的QQ,只能拿我的QQ试验了,如果你的智商还够用的话,胆子比较大的话,你很快就会去关别人的了。

WMIC

processwherename=”qq.exe”callterminate

解说:

1)这次我们是用交互式的方法来执行任务,具体界面我就不多说了,图上画的比我说的好多了。

2)Call也是个动词,这个动词可是厉害了,控制类的没有不用它的,它就是可以调用各种类的各种方法的大将。这里我们调用了terminate方法。从字面上你就可以看出是恶狠狠的。

3)Where能够让你查询和筛选。在超级多的实例中找到你想要的。实例就是指每个类的具体实现了。前面的例子中看到的各个进程都分别算是WIN32_PROCESS中的一个实例。

3.任务三:通过WMIC把远程主机的进程信息保存在一个网页中

这个任务和任务一中的大致相同,是任务一的加强。在任务一中信息以文本的形式显示出来了。其实除了文本形式的输出之外,WMIC还能够以其他形式返回命令执行结果,例如XML、HTML或者CSV(逗号分隔的文本文件),如图3所示。我们可以敲入下面的命令:

wmic/output:C:\1.html/node:192.168.1.2/user:netprocesslistfull/format:hform.xsl

输入密码:******

解释:

1)全局开关OUTPUT指明将这些信息保存在什么地方。

2)全局开关FORMAT指明了用什么样的格式,至于说有那些格式可以用,你可以参看C:\WINDOWS\syst通过WMIC命令远程打开远程计算机的远程桌面(Remote Desktop)功能 - 如云草 - 如云草的博客\wbem目录中的*.xsl文件,你甚至不用管它们从哪里来的,用就是了。挨着看看,一定可以找到你喜欢的。

第二部分:利用脚本来认识WMI

命令提示符的工具确实好用,但是却显示不出我们是高手,高手都是能利用程序来实现目的的。下面我们就开始用脚本来实现我们的任务,功能将更加强大,操作将更加灵活。

无论脚本还是真正意义上的程序,要检索WMI托管资源信息进而查询并利用WMI,都需要遵循以下三个步骤的。

1.连接到WMI服务。建立一个到目标计算机上的Windows管理服务的连接。

2.检索WMI托管资源的实例。主要取决于要执行的任务。

3.显示WMI某实例属性和调用其方法。

1.任务四:利用脚本实时监视对方进程

在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。

现在我们就按照前面提到的三个步骤来实现任务。

首先,我们连接到对方的WMI。在这里我们首先调用VBScript的中的Createobject()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是wbemscripting.swbemlocator。

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

注意其中的strComputer就是你所要连接的计算机的名称或者IP地址,strUser,strPwd当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。root\cimv2是WMI的命名空间,关于WMI的命名空间,大家可以到“计算机管理\WMI控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到WMI,返回一个对SWbemServices对象的引用,一旦有一个对SWbemServices对象的引用。我们就可以进行第二个步骤了。

在第二个步骤中,我们将得到WMI托管资源的实例,我们利用WbemServices中的一个方法ExecNotificationQuery可以查询我们所要的类,进而可以得到该类中实例。

SetcolMonitoredProcesses=wbemServices._

ExecNotificationQuery("select*from__instancecreationevent"_

&"within1whereTargetInstanceisa'Win32_Process'")

注意这里有个类似于SQL语言的查询语言,这里叫做WQL语言,懂SQL的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的colMonitoredProcesses是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。

在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过colMonitoredProcesses.NextEvent来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了CommandLine的属性值。

到现在你是否有些迷惑了,因为你还不知道到底WMI里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的wbemtest,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现WMI太大了,单是命名空间就有10多个,然后单是我们常用的空间root\CIMV2里面就有近1000个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,头晕了吧?没关系,其实你只需要知道其中的一些就好了。

看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。

SetcolArgs=WScript.Arguments

IfWScript.arguments.count<3then

WScript.Echo"USAGE:"&vbCrLf&"MonitorComputerUserPasswordfiles"

WScript.quit

EndIf

strComputer=wscript.arguments(0)

strUser=wscript.arguments(1)

strPwd=wscript.arguments(2)

strFile=wscript.arguments(3)

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

SetcolMonitoredProcesses=wbemServices._

ExecNotificationQuery("select*from__instancecreationevent"_

&"within1whereTargetInstanceisa'Win32_Process'")

i=0

DoWhilei=0

SetobjLatestProcess=colMonitoredProcesses.NextEvent

Wscript.Echonow&""&objLatestProcess.TargetInstance.CommandLine

SetobjFS=CreateObject("Scripting.FileSystemObject")

SetobjNewFile=objFS.OpenTextFile(strFile,8,true)

objNewFile.WriteLineNow()&""&objLatestProcess.TargetInstance.CommandLine

objNewFile.Close

Loop

到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为monitor.vbs的文件,然后在命令提示符下输入:

CSCRIPTmonitor.vbs

回车,你就会看到帮助,下面举例说明这个脚本的具体用法:

CSCRIPTmonitor.vbs192.168.1.2userpasswordC:\1.txt

在命令提示符下敲入上面的命令就OK了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到C:\1.txt看到这些信息。

小知识:

每次使用脚本,都必须敲入CSCRIPT和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是WSCRIPT,可以将它改成CSCRIPT。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:

cscript//nologo//h:cscript//s

这样你以后再运行这些脚本的时候就不用在敲入CSCRIPT了,也不用在写入.vbs的后缀名了,就上面的例子来说,你可以这样用:

monitor192.168.1.2userpasswordC:\1.txt

解释:

1)前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了WScript.Arguments这个对象,利用它我们可以来获取并处理脚本的参数。

2)那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用CTRL+C来完成,也可以用各种野蛮的方法来中止。

3)在代码中出现的另外一个核心对象就是FileSystemObject,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。

4)至于那个NOW,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。

5)如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:

monitor.""""C:\1.txt

2.任务五:利用脚本给对方开放共享

有了任务四的基础,这次我们就先看代码吧:

SetcolArgs=WScript.Arguments

IfWScript.arguments.count<5then

WScript.Echo"USAGE:"&vbCrLf&"RshareComputerUserPasswordSharePathShareName"

WScript.quit

EndIf

strComputer=wscript.arguments(0)

strUser=wscript.arguments(1)

strPwd=wscript.arguments(2)

strPath=wscript.arguments(3)

strShareName=wscript.arguments(4)

intMaximumAllowed=1

strDescription="Temporaryshare"

ConstSHARED_FOLDER=0

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

SetobjSWbemObject=wbemServices.Get("Win32_Share")

intReturnValue=objSWbemObject.Create(strPath,_

strShareName,_

SHARED_FOLDER,_

intMaximumAllowed,_

strDescription)

if(intReturnValue=0)Then

WScript.Echo"Thesharehavebeencreatedsuccessfully"

EndIf

解说:

1)我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。

2)紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。

3)连接到主机的WMI,然后就是查询。前面已经说的很详细了。

4)这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为0就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有MSDN那就好办了,到MSDN中可以查到该方法的更详细的内容。

5)这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在MSDN中可以很清楚地查到。比如0代表成功返回,2代表拒绝访问,9代表用户名错误,25代表主机名没有找到等等。

6)这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。

7)如上脚本创建后的共享是完全共享。就是可以删除修改文件的。

8)用法举例:sharenetpnetswswswC:\dodomarsh

好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过WMIC和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象Windows一样漂亮的脸蛋。今天我所提到的估计只能算是WMI的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。

1.任务四:利用脚本实时监视对方进程

在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。

现在我们就按照前面提到的三个步骤来实现任务。

首先,我们连接到对方的WMI。在这里我们首先调用VBScript的中的Createobject()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是wbemscripting.swbemlocator。

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

注意其中的strComputer就是你所要连接的计算机的名称或者IP地址,strUser,strPwd当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。root\cimv2是WMI的命名空间,关于WMI的命名空间,大家可以到“计算机管理\WMI控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到WMI,返回一个对SWbemServices对象的引用,一旦有一个对SWbemServices对象的引用。我们就可以进行第二个步骤了。

在第二个步骤中,我们将得到WMI托管资源的实例,我们利用WbemServices中的一个方法ExecNotificationQuery可以查询我们所要的类,进而可以得到该类中实例。

SetcolMonitoredProcesses=wbemServices._

ExecNotificationQuery("select*from__instancecreationevent"_

&"within1whereTargetInstanceisa'Win32_Process'")

注意这里有个类似于SQL语言的查询语言,这里叫做WQL语言,懂SQL的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的colMonitoredProcesses是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。

在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过colMonitoredProcesses.NextEvent来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了CommandLine的属性值。

到现在你是否有些迷惑了,因为你还不知道到底WMI里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的wbemtest,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现WMI太大了,单是命名空间就有10多个,然后单是我们常用的空间root\CIMV2里面就有近1000个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,头晕了吧?没关系,其实你只需要知道其中的一些就好了。

看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。

SetcolArgs=WScript.Arguments

IfWScript.arguments.count<3then

WScript.Echo"USAGE:"&vbCrLf&"MonitorComputerUserPasswordfiles"

WScript.quit

EndIf

strComputer=wscript.arguments(0)

strUser=wscript.arguments(1)

strPwd=wscript.arguments(2)

strFile=wscript.arguments(3)

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

SetcolMonitoredProcesses=wbemServices._

ExecNotificationQuery("select*from__instancecreationevent"_

&"within1whereTargetInstanceisa'Win32_Process'")

i=0

DoWhilei=0

SetobjLatestProcess=colMonitoredProcesses.NextEvent

Wscript.Echonow&""&objLatestProcess.TargetInstance.CommandLine

SetobjFS=CreateObject("Scripting.FileSystemObject")

SetobjNewFile=objFS.OpenTextFile(strFile,8,true)

objNewFile.WriteLineNow()&""&objLatestProcess.TargetInstance.CommandLine

objNewFile.Close

Loop

到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为monitor.vbs的文件,然后在命令提示符下输入:

CSCRIPTmonitor.vbs

回车,你就会看到帮助,下面举例说明这个脚本的具体用法:

CSCRIPTmonitor.vbs192.168.1.2userpasswordC:\1.txt

在命令提示符下敲入上面的命令就OK了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到C:\1.txt看到这些信息。

小知识:

每次使用脚本,都必须敲入CSCRIPT和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是WSCRIPT,可以将它改成CSCRIPT。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:

cscript//nologo//h:cscript//s

这样你以后再运行这些脚本的时候就不用在敲入CSCRIPT了,也不用在写入.vbs的后缀名了,就上面的例子来说,你可以这样用:

monitor192.168.1.2userpasswordC:\1.txt

解释:

1)前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了WScript.Arguments这个对象,利用它我们可以来获取并处理脚本的参数。

2)那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用CTRL+C来完成,也可以用各种野蛮的方法来中止。

3)在代码中出现的另外一个核心对象就是FileSystemObject,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。

4)至于那个NOW,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。

5)如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:

monitor.""""C:\1.txt

2.任务五:利用脚本给对方开放共享

有了任务四的基础,这次我们就先看代码吧:

SetcolArgs=WScript.Arguments

IfWScript.arguments.count<5then

WScript.Echo"USAGE:"&vbCrLf&"RshareComputerUserPasswordSharePathShareName"

WScript.quit

EndIf

strComputer=wscript.arguments(0)

strUser=wscript.arguments(1)

strPwd=wscript.arguments(2)

strPath=wscript.arguments(3)

strShareName=wscript.arguments(4)

intMaximumAllowed=1

strDescription="Temporaryshare"

ConstSHARED_FOLDER=0

setolct=createobject("wbemscripting.swbemlocator")

setwbemServices=olct.connectserver(strComputer,"root\cimv2",strUser,strPwd)

SetobjSWbemObject=wbemServices.Get("Win32_Share")

intReturnValue=objSWbemObject.Create(strPath,_

strShareName,_

SHARED_FOLDER,_

intMaximumAllowed,_

strDescription)

if(intReturnValue=0)Then

WScript.Echo"Thesharehavebeencreatedsuccessfully"

EndIf

解说:

1)我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。

2)紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。

3)连接到主机的WMI,然后就是查询。前面已经说的很详细了。

4)这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为0就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有MSDN那就好办了,到MSDN中可以查到该方法的更详细的内容。

5)这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在MSDN中可以很清楚地查到。比如0代表成功返回,2代表拒绝访问,9代表用户名错误,25代表主机名没有找到等等。

6)这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。

7)如上脚本创建后的共享是完全共享。就是可以删除修改文件的。

8)用法举例:sharenetpnetswswswC:\dodomarsh

好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过WMIC和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象Windows一样漂亮的脸蛋。今天我所提到的估计只能算是WMI的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。


什么是网络唤醒

网络唤醒(Wake-on-LAN,WOL)是一种计算机局域网唤醒技术,使局域网内处于关机或休眠状态的计算机,将状态转换成引导(Boot Loader)或运行状态。无线唤醒(Wake-on-Wireless-LAN,WoWLAN)作为 WOL 的补充技术,使用无线网卡去唤醒计算机。网络唤醒在一般的局域网环境里使用有限广播地址(255.255.255.255)即可,由于路由器都不转发目的地址为有限广播地址的数据报,因此在复杂网络情况下通常使用子网定向广播地址。在局域网外唤醒局域网内特定计算机,可以使用路由器的 DDNS 与端口转发。


在1996年10月,英特尔和 IBM 成立了 Advanced Manageability Alliance。1997年4月,联盟提出了 WOL 技术。这是 WOL 技术的起源,随后各大厂商纷纷推出了自己的 WOL 技术标准。本文所讨论的 WOL 技术是由 AMD 公司提出的 Magic Packet(幻数据包,魔术包)唤醒方式,这里给出 AMD 关于此技术的白皮书。


幻数据包(Magic Packet)

幻数据包是一个广播帧,包含目标计算机的MAC地址。由于 MAC 地址的唯一性,使数据包可以在网络中被唯一的识别。幻数据包发送通常使用无连接的传输协议,如 UDP ,发送端口为 7 或 9 ,这只是通常做法,没有限制。


WOL 技术被提出了将近20年,绝大多数的现代网卡都支持在超低功耗下监听特定的报文,如 ARP。如果设备网卡接收到一个与自己 MAC 地址相同的幻数据包,则网卡会向计算机的电源或主板发出信号以唤醒计算机。大部分的幻数据包在数据链路层(OSI模型第2层)上发送,当发送时,使用广播地址广播到给定的网络上,不使用IP地址(OSI模型第3层)。当然这是绝大部分情况,幻数据包也可以使用特定的 IP 地址进行发送。


幻数据包最简单的构成是6字节的255(FF FF FF FF FF FF FF),紧接着为目标计算机的48位MAC地址,重复16次,数据包共计102字节。有时数据包内还会紧接着4-6字节的密码信息。这个帧片段可以包含在任何协议中,最常见的是包含在 UDP 中。


FF FF FF FF FF FF FFMAC 地址 × 164-6字节的密码(可空)

例如 MAC 地址为 11 22 33 44 55 66 的目标计算机,幻数据包的格式为:


FFFFFFFFFFFF 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 112233445566 [ABABABABABAB(这里为6个字节的密码)]

1

幻数据包还有一些基本限制条件:


需要知道目标计算机 MAC 地址

不提供送达确认

可能无法在局域网之外工作

需要硬件进行支持

创建幻数据包

项目地址:https://github.com/ZhangGaoxing/wake-on-lan


该项目为 Xamarin 跨平台项目,包含 Xamarin.Android 与 UWP 。支持自动扫描添加局域网设备。


关于 MAC 地址的扫描获取,这里只说一下思路,详细请查阅代码。第一种方式,也是我最开始想到的方式,使用 Ping 来 Ping 整个网段。开了四个线程,1-255大概需要30多秒,稍微有点慢,而且 .NET 的 Ping 类在 Android 上无法限制秒数。第二种方式,百度到的,直接向整个网段发送 UDP 消息,2秒解决战斗。扫描完成后获取 ARP 表就行。


下面给出的是发送幻数据包的方法:


public static async void Wake(string broadcast, int port, byte[] mac)

{

    using (UdpClient udp = new UdpClient())

    {

        udp.EnableBroadcast = true;


        byte[] packet = new byte[6 + 16 * 6];


        for (int i = 0; i < 6; i++)

        {

            packet[i] = 0xFF;

        }


        for (int i = 0; i < 16; i++)

        {

            for (int j = 0; j < 6; j++)

            {

                packet[6 + i * 6 + j] = mac[j];

            }

        }


        await udp.SendAsync(packet, packet.Length, broadcast, port);

    }

}

————————————————

版权声明:本文为CSDN博主「高兴高兴张高兴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/z5859095/article/details/82745474


互联网普及率的日渐攀升与 IPv4 资源的持续减少,现在大部分家庭宽带都不会分配公网 IP ,这使一些网络应用的实现多了些困难,像个人的 NAS 和一些智能家居设备。对于分配公网 IP ,各地运营商的态度也不同,有的去找客服反应可以要一个公网 IP ,还有些则直接告诉你每年多少钱。这些情况在 IPv6 普及之前都不会改善。


前几天看到了人民网的一条新闻:阿里云联合三大运营商全面提供IPv6服务。虽然现在网上有部分人对中国大力发展 IPv6 的目的持怀疑态度,认为是出于监管的目的,但我对此还是很支持的。首先我是很爱国的,按现在的话说叫“小粉红”,这是精神层面的原因。其次是网络安全问题,这是本届政府的战略思想, IPv4 的发展我们没赶上,资源都在美国佬手中,我们是受制于人的,虽说没像中兴一样。还有就是互联网发展的势头太猛,中国是互联网大国,互联网+的国策一直推进,各种物联网设备激增,像工业数据采集和智能家居设备,这都需要大量的 IP 地址。


人民网北京6月21日电(记者孟哲)IPv6作为下一代互联网的技术基础,对物联网、车联网、人工智能等新兴产业的发展有着重大影响。昨日,阿里云宣布联合三大运营商全面对外提供IPv6服务,希望能在2025年前帮助中国互联网真正实现“IPv6 Only”。


阿里云联合三大运营商全面提供IPv6服务


什么是 FRP

FRP (Fast Reverse Proxy) 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP , UDP , HTTP , HTTPS 协议。下载https://github.com/fatedier/frp/releases


(说到这里,我的“互联网传输助手”也是一款反向代理应用,用于在互联网内安装此应用的设备间传输数据。配合“互联网传输助手-服务”程序,未分配公网 IP 的设备也可收发数据。“互联网传输助手-服务”程序我暂时没有发布,因为有时会出现传输数据丢失的情况,不知道是网络的原因还是其他,待我解决了再说。?)


准备工作

1. 一台拥有公网 IP 的设备(云服务器、VPS ……)

这就是一台反向代理服务器,作为外网设备访问内网设备的一座桥梁。

2. 域名(可选)

如果你不想输入一大串 IP 地址的话,买个好记的域名吧。

安装 FRP

这里反向代理服务器使用的是阿里云的云服务器,安装 Windows Server 2016 Datacenter 。内网要远程连接的设备安装的是 Windows 10 1803 。如果使用的是 Linux 系统的服务器,只是 FRP 的安装过程不同,可以百度一下其他 FRP 的文章进行参考。考虑到如果只是用服务器进行反向代理的话,没有必要购买 Windows 服务器,因为相比于 Linux ,运行 Windows 的配置要高一些,价格也更贵一些。


下载链接在文章的开头已经给出,根据服务器的系统和处理器类型选择,这里选择 frp_0.20.0_windows_amd64.zip ,下载完成后解压。




服务器(frps)

首先要配置一下入方向的安全组规则,需要穿透的端口得放行,我这里直接开放了一个端口范围,一劳永逸,各位按需开放即可。

接下来配置一下设置,解压后有两个配置文件,一个是 frps.ini 另一个是 frps_full.ini 。 frps_full.ini 是全配置,里面所有的配置都有,玩法很多,各位自行研究,这里只挑几个有用的。将下面配置代码复制到 frps.ini 后保存。控制台可以输入“服务器IP:端口号”进行访问,如“1.2.3.4:7500”。

```ini

[common]

bind_port = 7000 ;要绑定的端口


dashboard_user = admin ;控制台的用户名

dashboard_pwd = password ;控制台的密码

dashboard_port = 7500 ;控制台的端口

```

然后把配置文件 frps.ini 与程序 frps.exe 复制到服务器。

最后使用 cmd 或 power shell 切换到相应目录运行即可

ini frps -c frps.ini

power shell 要使用

ini .\frps.exe -c frps.ini


内网设备(frpc)

首先配置一下 frpc.ini

```ini

[common]

server_addr = 1.2.3.4 ;服务器的 IP

server_port = 7000 ;服务器上设置的服务绑定端口


[RDP] ;这个是反向代理的名称,可以随意设置

type = tcp ;RDP 是 TCP 协议的

local_ip = 127.0.0.1 ;本机 IP

local_port = 3389 ;远程桌面的默认端口

remote_port = 7001 ;外网访问的端口

```

然后把配置文件 frpc.ini 与程序 frpc.exe 复制到内网设备。

最后使用 cmd 或 power shell 切换到相应目录运行即可

ini frpc -c frpc.ini

power shell 要使用

ini .\frpc.exe -c frpc.ini


内网设备开启远程桌面

右击“此电脑”,选择“系统”——“远程设置”——“允许远程连接至此电脑”




运行远程桌面

在小娜或运行中输入“mstsc”或“远程桌面连接”,“计算机”中输入“服务器 IP:外网访问端口”,如“1.2.3.4:7001”。不出意外的话,是可以从外网访问到内网设备的。




绑定域名

这里域名的服务商是阿里云(万网),在域名控制台中对相应的域名选择“解析”。跳转到云解析界面后点击“添加记录”。我们需要添加一条类型为 A 的记录。记录值为服务器 IP。

配置 frpc.ini 。加一行 custom_domains = xxx.yourdomain.xxx 。如

ini [RDP] ;这个是反向代理的名称,可以随意设置 type = tcp ;RDP 是 TCP 协议的 local_ip = 127.0.0.1 ;本机 IP local_port = 3389 ;远程桌面的默认端口 remote_port = 7001 ;外网访问的端口 custom_domains = xxx.yourdomain.xxx

这样就能使用 “你的域名:端口” 进行远程桌面连接了。


总结

FRP 的玩法很多,如果你的路由器是智能路由器的话,可以将 FRP 部署到你的路由器上,也可以搭建 NAS ,甚至将内网部署的 WEB 应用映射到外网(当然,在国内这是违法的,有条件的话还是要备案一下)等等。 但体验指数上完完全全取决于你的云服务器宽带。 内网穿透,反向代理,都只是弥补没有公网 IP 的遗憾罢了。

————————————————

版权声明:本文为CSDN博主「高兴高兴张高兴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/z5859095/article/details/82819067


最近在实验室想控制家里的电脑。控制很容易, TeamViewer 就好啦。但是白天家里没人,没人帮我开电脑,于是找到了 WOL 这种方法。

设置主板 BIOS

需要在 BIOS 中进行更改。我的是微星 BIOS,操作如下

高级 -> 换型事件设置 -> 将 PCIE设备唤醒网络唤醒 设置为 允许 (Enable)

设置 BIOS

其他 BIOS 也类似,因为网卡也属于 PCIE 设备,所以 PCIE设备唤醒 也需要打开。

设置网卡

在设备驱动管理器中,找到 网络适配器 ,在第一个驱动 右键 -> 属性

设置网卡_1

高级 菜单中的属性找到 唤醒魔包 (Wake on Magic Packet) 设置为 启用

设置网卡_2

电源管理勾选 允许此设备唤醒计算机

设置网卡_3

配置路由器 DDNS (动态 DNS) 服务

由于 IPV4 地址紧张,运营商宽带都是使用的动态 IP 地址,这就需要 动态 DNS 服务 进行穿透局域网。

我家的路由器是 网件 NETGEAR R7800 所以这里使用 NETGEAR 的 DDNS 服务,其他路由器基本也有自己的 DDNS 服务,大家可以自己选择。

首先登录路由器控制界面,一般是浏览器输入 192.168.0.1 / 192.168.1.1 / 10.0.0.1 等进入。

找到 DDNS  或者 动态 DNS ,注册 DDNS 服务商。网件提供三个 DDNS 服务商,我选择的是 www.No-IP.com

DDNS_1

找到 端口映射/端口触发,在 端口映射添加自定义服务

端口映射_1

服务名随便填,协议:TCP/UDP,外部端口组内部端口组 一致即可,内部 IP 地址映射到家里电脑的 IP。

端口映射_2

这样,你就可以使用 WOL 软件发送一个数据包唤醒家里的电脑了。

有一个网站就可以使用 https://www.depicus.com/wake-on-lan/woli

该网站还提供了 windows, mac OS, Android, iOS 等不同平台的应用,有需要的可以自行下载。

WOL app

mac 地址可以在控制台输入 ipconfig /all 获取;

IP 地址填 域名即可

子网掩码为 255.255.255.255

端口号为之前设的外部和内部端口号。



作者:训哥
链接:https://www.jianshu.com/p/d89b5560c3ed
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


问题:在Nginx中配置反向代理,使用时发现页面显示Nginx 502 Bad Gateway。指的是网关错误或者网关无效,因为自己在设置配置文件nginx.conf中的proxy_pass时设置出错。




解决方式:首先本项目是部署在本地的,所以在配置反向代理时的proxy_pass时应当使用本机的IP:127.0.0.1:9001,修改完毕后即可通过server_name中的xxx.xxx.com去访问到自己的服务了。


    server {

             listen       80;

             server_name  xxx.xxx.com;

 

             proxy_set_header X-Forwarded-Host $host;

             proxy_set_header X-Forwarded-Server $host;

             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

             location / {

                     proxy_pass http://127.0.0.1:9001; # 主机地址下的9001端口

                     proxy_connect_timeout 600;

                     proxy_read_timeout 600;

                 }

         }

注:若希望通过xxx.xxx.com来访问我们首先需要设置域名解析,将C:\Windows\System32\drivers\etc\下的hosts文本文件中的域名解析(修改需要管理员权限)设置为如下图所示:




反向代理只是根据我们访问的server_name来代理到一个具体的服务提供ip+端口 

————————————————

版权声明:本文为CSDN博主「RollingTune」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_33500238/article/details/105494889