分类 大观园 下的文章

一.介绍

前面介绍了ngrok,也说了它的1.x版本具有一些Bug并且作者放弃了维护,那么,谁能够取代ngrok在内网穿透工具中的地位呢?我觉得frp也许可以,frp是fast reverse proxy的缩写,其可用于反向代理和内网穿透,支持tcp, udp, http, https 协议,这比ngrok还多了个udp。并且发布以来广受欢迎,积累了不少用户,作者也是很勤快,一直在修复bug和更新新特性。

并且,作者是个中国人,所以在GitHub上还有中文文档,写的还挺详细的,不过……不去看文档是很多人的特点,所以我这边还是记点东西来介绍下简单的安装和操作配置。

二.安装配置

frp提供了热门平台的程序文件,所以安装也变得比较简单了,我这边的是Linux 64位平台的,其它的请自己去下——>传送门

1

2

3

4

5

wgethttps://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz

tarxzffrp_0.12.0_linux_amd64.tar.gz

mvfrp_*/frps/usr/bin/

mkdir/etc/frp/

rm-rf frp_*

然后根据下面配置你自己改了填到配置文件中

1

vi/etc/frp/frps.ini

下面是我翻译的带说明的服务端配置文件,就这么凑和着看吧

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

[common]

#frp服务器监听地址,如果是IPV6地址必须用中括号包围

bind_addr=0.0.0.0

#frp服务器监听端口

bind_port=7000

 

#kcp的udp监听端口,如果不设那就不启用

#kcp_bind_port = 7000

#指定使用的协议,默认tcp,可选kcp

#protocol = kcp

 

#如果要使用vitual host,就必须设置

#vhost_http_port = 80

#vhost_https_port = 443

 

#Web后台监听端口

dashboard_port=7500

 

#Web后台的用户名和密码

dashboard_user=admin

dashboard_pwd=admin

 

#Web后台的静态资源目录,调试用的,一般不设

#assets_dir = ./static

 

#日志输出,可以设置为具体的日志文件或者console

log_file=/var/log/frps.log

 

#日志记录等级,有trace, debug, info, warn, error

log_level=info

#日志保留时间

log_max_days=3

 

#启用特权模式,从v0.10.0版本开始默认启用特权模式,且目前只能使用特权模式

#privilege_mode = true

 

#特权模式Token,请尽量长点且复杂

privilege_token=12345678

 

#特权模式允许分配的端口范围

privilege_allow_ports=2000-3000,3001,3003,4000-50000

 

#心跳超时,不用改

#heartbeat_timeout = 90

 

#每个代理可以设置的连接池上限

#max_pool_count = 5

 

#认证超时时间,一般不用改

#authentication_timeout = 900

 

#如果配置了这个,当你的模式为http或https时,就能设置子域名subdomain

#subdomain_host = frps.com

 

#是否启用tcp多路复用,默认就是true,不用管

#tcp_mux = true

在这个配置文件中老版本是可以不启用特权模式或者同时添加其它的section来在服务端配置其它的转发设置的,但是从v0.10.0版本开始后特权模式暂时是唯一可用的(因为方便,不用为了一个配置而既要改服务端又要改客户端)

在修改好服务端配置文件后,我们可以启用frp的服务端了

1

frps-c/etc/frp/frps.ini

然后服务端就OK了,下面开始配置客户端,客户端程序自己在GitHub上面下,各个平台的包里面frps是服务器,frpc就是客户端

配置文件如下,自己修改后保存为frpc.ini

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

[common]

#frp服务器地址

server_addr=1.2.3.4

#frp服务器端口

server_port=7000

#特权模式Token

privilege_token=12345678

#转发SSH

[ssh]

type=tcp

#可以指定为其它IP,默认是本地

#local_ip = 127.0.0.1

local_port=22

remote_port=6000

#启用加密

use_encryption=true

#启用压缩

use_compression=true

 

#转发Web

[web]

type=http

local_port=80

custom_domains=www.yourdomain.com

#修改header中的host

#host_header_rewrite = dev.yourdomain.com

#启用简单HTTP认证

#http_user = abc

#http_pwd = abc

#在服务端配置了subdomain_host的情况下用于自定义二级域名

#subdomain = test

#在存在多个相同域名的情况下通过请求的URL路由到不同的配置

#locations = /news,/about

 

#转发DNS请求

[dns]

type=udp

local_ip=8.8.8.8

local_port=53

remote_port=6000

 

#转发Unix域套接字(这儿是Docker)

[unix_domain_socket]

type=tcp

remote_port=6000

plugin=unix_domain_socket

plugin_unix_path=/var/run/docker.sock

 

#HTTP代理

[http_proxy]

type=tcp

remote_port=6000

plugin=http_proxy

#配置http代理的简单认证

#plugin_http_user = abc

#plugin_http_passwd = abc

以上是大部分的参考,如果你有啥需要的参照着改就行了

在Linux等平台下,执行如下命令就行

1

frpc-c/path/to/frpc.ini

而在Windows下,需要你创建一个frpc.exe的快捷方式,然后将参数加到快捷方式属性的目标那一栏的frpc.exe后面,也可以自己百度下如果将命令注册为系统服务来实现常驻

成功运行后,访问服务器的7500端口会有一个WebGUI,如下,显示当前的状态,左侧的Proxies里会显示客户端注册的各种转发规则

至于客户端这儿有日志提示是否连上服务器,是否成功启用配置啥的

总的来说还是挺好用的,比较期待以后还有啥新的功能_(:з」∠)_


ChangeStartMode Method of the Win32_Service Class


The ChangeStartMode  WMI class method modifies the start mode of a Win32_Service .
This topic uses Managed Object Format (MOF) syntax. For more information about using this method, see Calling a Method .

Syntax

MOF

uint32 ChangeStartMode(

  [in]  string 
);

Parameters

    StartMode
  •  [in]
  • Start mode of the Windows base service.

    ValueMeaning
    • Boot

    Device driver started by the operating system loader. This value is valid only for driver services.

    • System

    Device driver started by the operating system initialization process. This value is valid only for driver services.

    • Automatic

    Service to be started automatically by the Service Control Manager during system startup.(特别需要注意,在检索时间所检索到自启动服务的StartMode为Auto)

    • Manual

    Service to be started by the Service Control Manager when a process calls the StartService method.

    • Disabled

    Service that can no longer be started.

Return Value

Returns one of the values listed in the following table or any other value to indicate an error.

Return codeDescription
  • 0

Success

  • 1

Not Supported

  • 2

Access Denied

  • 3

Dependent Services Running

  • 4

Invalid Service Control

  • 5

Service Cannot Accept Control

  • 6

Service Not Active

  • 7

Service Request Timeout

  • 8

Unknown Failure

  • 9

Path Not Found

  • 10

Service Already Running

  • 11

Service Database Locked

  • 12

Service Dependency Deleted

  • 13

Service Dependency Failure

  • 14

Service Disabled

  • 15

Service Logon Failure

  • 16

Service Marked For Deletion

  • 17

Service No Thread

  • 18

Status Circular Dependency

  • 19

Status Duplicate Name

  • 20

Status Invalid Name

  • 21

Status Invalid Parameter

  • 22

Status Invalid Service Account

  • 23

Status Service Exists

  • 24

Service Already Paused


共享服务

-- 查看服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"

-- 设置启动类型

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  changestartmode 'Manual'


https://blog.csdn.net/dongzhiquan/article/details/3956906

-- 启动服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  call startservice


-- 停止服务

wmic /node:192.168.6.56 /user:administrator service where "caption= 'server'"  call stopservice


方法执行成功。

外参数:

instance of __PARAMETERS

{

        ReturnValue = 0;  -- 成功,其他属于有异常情况

};


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