国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Windows管理規(guī)范的機房信息可視化方案

2020-08-31 01:38嚴強
軟件工程 2020年8期
關(guān)鍵詞:機房管理

嚴強

摘 ?要:從機房管理實際工作出發(fā),提出了日常機房管理中需要經(jīng)常使用的系統(tǒng)信息和處理要求。給出了在Windows管理規(guī)范支持下的詳細的同時兼容Windows 7、Windows 10和Windows Server的可視化設(shè)計方案,并運用C#的窗體透明和嵌入桌面技術(shù)對此加以實現(xiàn)。本方案完成后首先在新建機房實施部署,經(jīng)過一個多學期的使用,得到了上課教師和機房管理員的肯定和好評。目前正逐步在其余機房中部署。

關(guān)鍵詞:Windows管理規(guī)范;機房管理;透明窗體;嵌入桌面;Windows服務(wù)

中圖分類號:TP311 ? ? 文獻標識碼:A

Abstract: In view of system information and processing requirements that are often used in daily computer lab management, a computer lab information visualization project, which is compatible with Windows 7, Windows 10 and Windows Server under the support of Windows Management Instrumentation(WMI), is proposed and achieved by using C# form transparency and embedded desktop technology. When completed, it was first deployed in the newly-built computer labs. After a semester of trial, it was highly praised by both the lecturers and the computer lab administrators. It is now being gradually deployed in the remaining computer labs.

Keywords: WMI; computer lab management; transparent form; embedded desktop; windows service

1 ? 引言(Introduction)

隨著計算機技術(shù)和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展和進步,機房管理系統(tǒng)技術(shù)及市場也日趨成熟和完善。從最初的純硬件版、純軟件版到軟硬件結(jié)合版、網(wǎng)絡(luò)版,再到現(xiàn)在的服務(wù)器集中管理以及智慧教室。各種各樣的管理系統(tǒng)層出不窮,但最終實現(xiàn)的功能都是最大程度地提高機房利用率和管理效率。

目前我院大部分機房采用的是軟硬件結(jié)合的獨立管理模式。管理系統(tǒng)將機房計算機硬盤分成若干個分區(qū),在不同的分區(qū)中安裝不同的操作系統(tǒng)和教學軟件,滿足不同專業(yè)和班級的教學及考試要求的。

根據(jù)實際管理,需要經(jīng)常顯示的信息包括機器號、機器名、IP地址、操作系統(tǒng)及類型、物理內(nèi)存及可用內(nèi)存、各邏輯分區(qū)的容量及剩余容量等信息,其中IP地址、可用內(nèi)存以及邏輯分區(qū)剩余容量要求跟隨變化。同時要求這些信息要始終顯示在桌面的右上角,除文字以外其余空白處不能遮擋桌面上該位置的信息,要求顯示的信息不受WIN+M鍵、WIN+D鍵、Alt+Tab鍵和任務(wù)欄右側(cè)的“顯示桌面”按鈕控制。

2 ? 方案確立(Project establishment)

2.1 ? ?確定顯示方案

(1)需求分析要求顯示文字以外的空白處不能遮擋桌面上的信息,因而確定將軟件窗體設(shè)置為背景透明、窗體上的控件也設(shè)為背景透明,且為無邊框窗體。

(2)要求窗體不受WIN+M鍵、WIN+D鍵、Alt+Tab鍵和任務(wù)欄右側(cè)的“顯示桌面”按鈕控制??紤]方案有兩種:

方案一:使用全局鍵盤鉤子和鼠標鉤子,在窗體的全局鍵盤鉤子中過濾WIN+M鍵、WIN+D鍵、Alt+Tab鍵和Alt+F4鍵,鼠標鉤子捕捉任務(wù)欄右側(cè)的“顯示桌面”區(qū)域并過濾。

方案二:將窗體嵌入到桌面里作為桌面的一個子窗體,因為桌面不受WIN+M鍵、WIN+D鍵、Alt+Tab鍵和Alt+F4鍵控制,所以桌面中的子窗體也不受這些鍵控制。

考慮到方案一要截獲系統(tǒng)的鍵盤和鼠標消息,由于窮盡不了各種應(yīng)用軟件和考試系統(tǒng)環(huán)境下的測試,所以該方案存在未知風險。方案二不截獲任何系統(tǒng)消息,不存在上述風險,安全性高于方案一,所以軟件采用方案二。

2.2 ? 數(shù)據(jù)獲取方法

需求分析中提出的各種信息的獲取,查閱了相關(guān)資料和網(wǎng)站,發(fā)現(xiàn)獲取機器名及IP地址的方法有多種,獲取和硬件相關(guān)數(shù)據(jù),如物理硬盤、物理內(nèi)存等的方法相對比較集中。結(jié)合本人掌握的編程語言,數(shù)據(jù)獲取方法采用調(diào)用Win32應(yīng)用程序編程接口[1-3](Application Programming Interfaces,API)和Windows管理規(guī)范[4,5](Windows Management Instrumentation,WMI)混合使用方法。

3 ? 方案設(shè)計(Project design)

3.1 ? 總體設(shè)計

總體結(jié)構(gòu)設(shè)計如圖1所示。軟件由操作系統(tǒng)識別、Windows 10處理模塊、Windows 7處理模塊、Windows Server處理模塊和WMI本機應(yīng)用程序編程接口模塊組成。Windows Server處理模塊顯示的信息和格式與Windows 10和Windows 7不同,且該模塊設(shè)計為通用各種Windows Server操作系統(tǒng)。以上各模塊通過WMI本機應(yīng)用程序編程接口模塊調(diào)用WMI核心結(jié)構(gòu)獲取數(shù)據(jù)。

3.2 ? 詳細設(shè)計

(1)Windows 10模塊

模塊功能設(shè)計如圖2所示。在Windows 10下獲取并顯示的數(shù)據(jù)有機器編號、機器名、IP地址、操作系統(tǒng)和類型、物理內(nèi)存和可使用內(nèi)存、物理硬盤數(shù)量及容量、邏輯分區(qū)及容量和分區(qū)剩余容量。刷新定時器用于監(jiān)視IP地址、可使用內(nèi)存以及邏輯分區(qū)剩余容量的實時變化。

(2)Windows Server模塊

模塊功能設(shè)計如圖3所示。本模塊用于作為服務(wù)器使用的Windows Server系統(tǒng)(目前使用的是Windows Server 2012 R2),有別于作為學生機使用的Windows 7、Windows 10系統(tǒng)。主體功能結(jié)構(gòu)中的“時鐘定時器”用于同步顯示日期和時間。

(3)Windows 7模塊

模塊功能設(shè)計如圖4所示。

在Windows 7操作系統(tǒng)中,經(jīng)過透明處理后的窗體嵌入桌面前,須要停止Windows的“Desktop Window Manager Session Manager”服務(wù)。因而在本模塊中增加一個“Windows服務(wù)處理接口功能”子模塊,該子模塊的功能是提供停止、啟動、復位已經(jīng)安裝的某項Windows服務(wù)的接口功能,即通過該子模塊去停止、啟動和復位一個指定的Windows服務(wù)。同時該子模塊也提供查詢某項Windows服務(wù)是否已經(jīng)安裝。本軟件結(jié)束運行前重新啟動該服務(wù)。模塊的主體功能結(jié)構(gòu)與處理和Windows 10的相同。

4 ? 方案實現(xiàn)(Solution realization)

4.1 ? 使用WMI獲取相關(guān)數(shù)據(jù)

(1)WMI編程接口

WMI是Windows Management Instrumentation縮寫,又稱Windows管理規(guī)范。WMI的結(jié)構(gòu)體系如圖5所示。

由圖5可見WMI的核心結(jié)構(gòu)由四部分組成:①WMI腳本庫,它的位置是%SystemRoot%\System32\Wbem\wbemdisp.dll。②公共信息模型對象管理器(Common Information Model Object Manager-CIMOM),是描述Windows操作系統(tǒng)構(gòu)成單元的對象數(shù)據(jù)庫。它的位置是%SystemRoot%\System32\Wbem\WinMgmt.exe。③公共信息模型(CIM)和WMI存儲庫。④WMI提供程序,它是一組DLL文件。位置是%SystemRoot%\System32\Wbem\*.dll。

一般②③④被稱為CIM庫。所以通常將WMI看成有CIM庫和WMI腳本對象兩部分組成。

(2)WMI使用方法及步驟

WMI使用一般分為四步:①創(chuàng)建WMI對象腳本庫的指針實例。②調(diào)用實例方法,連接到CIM庫,同時指明要訪問資源的邏輯地址。③獲取托管資源,即WMI托管資源(類)的實例集合。④遍歷實例集合,獲取相關(guān)屬性值的數(shù)據(jù)。

(3)C#使用WMI方法

在VS2015的解決方案管理器[6-8]的項目中添加引用System.Management,并添加名字空間using System.Management。

ManagementObject或ManagementClass:是公共信息模型(CIM)管理對象或類。管理類是一個WMI類,如Win32_PhysicalMemory和Win32_LogicalDisk,前者是物理內(nèi)存后者是邏輯分區(qū)。

ManagementObjectSearcher:查詢檢索指定的對象的集合。也可以用來枚舉由ManagementObject或ManagementClass獲取的對象集合。

下面是獲取邏輯分區(qū)及分區(qū)容量實現(xiàn)代碼:

#region獲取邏輯分區(qū)及分區(qū)容量

///

/// 獲取邏輯分區(qū)及分區(qū)容量

///

///

public List GetDiskListInfo()

{

List hdp_list = null; // 定義一個邏輯分區(qū)結(jié)構(gòu)列表

Try ? //指定分區(qū)的容量信息

{

// WQL 查詢類 SQL查詢 WMI類關(guān)鍵字“Win32_LogicalDisk”

SelectQuery selectQuery = new SelectQuery("select * from Win32_LogicalDisk");

// WMI查詢管理對象集合,用上述查詢結(jié)果實例化

ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);

// 定義 WMI 類對象集合,并獲取查詢結(jié)果(即:獲取所有邏輯分區(qū)集合)

ManagementObjectCollection diskcollection = searcher.Get();

if (diskcollection != null && diskcollection.Count > 0) // 邏輯分區(qū)數(shù)量大于0

{

hdp_list = new List(); // 給邏輯分區(qū)結(jié)構(gòu)列表分配空間

HardDiskPartition harddisk = null; // 定義一個邏輯分區(qū)結(jié)構(gòu)列表臨時變量

foreach (ManagementObject disk in diskcollection) // 變量獲取到的邏輯分區(qū)集合

{

int nType = Convert.ToInt32(disk["DriveType"]); // 獲取硬盤類型標志值

if (nType != Convert.ToInt32(DriveType.Fixed)) continue;// 硬盤標志為”Fixed”(固定硬盤)

else

{

harddisk = new HardDiskPartition(); // 給臨時變量分配空間

// 獲取剩余空間并轉(zhuǎn)成GB(保留兩位小數(shù))

harddisk.FreeSpace = ToGB(Convert.ToDouble(disk["FreeSpace"]), 1024.0, 2);

// 獲取分區(qū)總空間并轉(zhuǎn)成GB(保留兩位小數(shù))

harddisk.SumSpace = ToGB(Convert.ToDouble(disk["Size"]), 1024.0, 2);

// 獲取邏輯分區(qū)名稱(如:C:、D:、E:)

harddisk.PartitionName = disk["DeviceID"].ToString();

hdp_list.Add(harddisk); // 加入列表

harddisk.SetSumFreeSpace(Convert.ToDouble(disk["Size"]), Convert.ToDouble(disk["FreeSpace"]));

}

}

}

}

catch (Exception) ?{ ? }

return hdp_list;

}

#endregion

4.2 ? 實現(xiàn)窗體嵌入桌面

4.2.1 ? 識別窗體

Windows操作系統(tǒng)有一套自成的窗體管理機制,實現(xiàn)對窗體結(jié)構(gòu)、窗體類型、窗體狀態(tài)、窗體間關(guān)系、窗體消息等進行管理。

在Windows操作系統(tǒng)運行過程中,用戶每打開一個窗體,操作系統(tǒng)都會給這個窗體設(shè)定一個唯一的標識符號用于管理,以此區(qū)分其他窗體。這個唯一的標識符號稱之為句柄(Handle),是一個唯一的數(shù)值。程序員可用通過Microsoft提供的Win32應(yīng)用程序編程接口(Application Programming Interfaces,API)和窗體類名來獲取已經(jīng)打開的窗體句柄,通過對句柄的操作來完成由句柄對應(yīng)的窗體的操作。

4.2.2 ? 相關(guān)API函數(shù)

本設(shè)計中主要相關(guān)的API函數(shù):

FindWindow:根據(jù)窗體類名和窗體標題尋找窗體列表中第一個符合指定條件的頂級窗體,獲取該窗體的句柄。

FindWindowEx:根據(jù)父窗體句柄和子窗體類名在窗體列表中尋找與指定條件相符的第一個子窗口。

GetParent:根據(jù)子窗體句柄獲取其父窗體句柄。

SetParent:給窗體重新指定一個父窗體。本軟件就是使用此函數(shù)實現(xiàn)將窗體嵌入桌面的。

4.2.3 ? 桌面結(jié)構(gòu)

要能夠?qū)崿F(xiàn)將窗體用SetParent函數(shù)嵌入桌面,首先就要能獲取到桌面的句柄。在Windows中,桌面也是作為窗體來管理的,可以通過FindWindow函數(shù)獲取到桌面句柄。

(1)桌面組成

要使用FindWindow函數(shù)獲取到桌面的句柄,就要知道桌面的窗體標題和它的類名。通過查閱資料,得到了桌面的窗體標題和類名分別是“Program Manager”和“Progman”。這樣使用FindWindow函數(shù)可以輕松獲取到桌面窗體Progman的句柄。

為了更多的了解Windows桌面組成,以及Windows 7、Windows 10、Windows Server的桌面結(jié)構(gòu)是否相同。使用EnumWindows和EnumChildWindows等API函數(shù)做了一個工具程序,用它枚舉出系統(tǒng)中的所有窗體,并根據(jù)窗體之間的父子關(guān)系整理并保存到樹形列表控件TreeView中,因此桌面的組成結(jié)構(gòu)一目了然,分別在Windows 7、Windows 10和Windows Server 2012中運行,得到如圖6所示的桌面窗體結(jié)構(gòu)。

從圖6所示的Windows桌面結(jié)構(gòu)來看,桌面的頂層父窗體是Progman,窗體標題是Program Manager,窗體可見且透明;第一層子窗體是SHELLDLL_DefView,沒有窗體標題,窗體可見且透明;第二層子窗體是SysListView32(是包含桌面圖標的窗體,該窗體實際上是ListView列表控件),窗體標題是FolderView,窗體可見且透明;第三層子窗體是SysHeader32,沒有窗體標題,窗體不可見。由此可見并非是網(wǎng)上和一些資料上說的三層結(jié)構(gòu),而是四層結(jié)構(gòu),且在Windows 7、Windows 10和Windows Server 2012 R2中具有相同的結(jié)構(gòu)。

(2)選擇嵌入的桌面窗體

根據(jù)圖6的桌面結(jié)構(gòu),從前到后的窗體排列順序是SysHeader32、SysListView32、SHELLDLL_DefView、Progman??梢姡豢梢姶绑wSysHeader32外,其余三個窗體均可作為本軟件窗體的父窗體。實際編程中選擇了Progman窗體作為本軟件窗體嵌入的父窗體,因為該窗體是最后一層窗體,嵌入后不會影響和干擾軟件窗體所在位置的上層窗體的操作。

(3)窗體透明處理

C#的窗體控件中有兩個屬性用于控制窗體透明的,Opacity和TransparencyKey。前者用透明度來控制窗體透明,取值是0%—100%,窗體中的控件隨之一同透明。后者是窗體根據(jù)設(shè)定的關(guān)鍵顏色透明,窗體中的控件不隨之透明。

this.Opacity = 0;窗體完全透明,窗體中所有控件均透明,不可見。

this.Opacity = 1;窗體完全不透明(常規(guī)狀態(tài))。

this.TransparencyKey = color.Red;窗體和窗體中的控件的紅色部分被透明掉。

this.TransparencyKey = this.BackColor;窗體按照背景顏色透明。本設(shè)計使用此方式設(shè)置窗體透明,同時還須將窗體中的控件的背景顏色設(shè)置為Color.Transparent。

(4)透明后窗體嵌入桌面

窗體透明并嵌入桌面,只需要在窗體加載事件的合理位置執(zhí)行下面兩條命令即可。

this.TransparencyKey = this.BackColor;

SetParent(this.Handle, hDesktopWnd);

可是在實際的測試運行中并非如此。在Windows Server 2012 R2系統(tǒng)下窗體嵌入正常。

在Windows 10系統(tǒng)中,執(zhí)行這兩條命令后,窗體可以嵌入桌面,但窗體不能完全透明,窗體區(qū)域呈無規(guī)律的花屏狀態(tài)。經(jīng)過多次調(diào)試,最終按如下處理后可以正常透明嵌入桌面。

①設(shè)計狀態(tài)將窗體的BackColor屬性設(shè)為透明顏色;

②窗體的Form_Load事件中執(zhí)行this.TransparencyKey = this.BackColor;

③窗體的Form_Resize事件中執(zhí)行SetParent(this.Handle, hDesktopWnd);

在Windows 7操作系統(tǒng)中,執(zhí)行這兩條命令問題比較大,每次運行后軟件窗體消失不見。按照在Windows 10中的方法處理后依然如故。使用斷點單步調(diào)試運行,得到關(guān)鍵點的數(shù)據(jù)和變量狀態(tài)全部正常。后來注解掉this.TransparencyKey = this.BackColor;,再次運行,在桌面的右上角可以看到非透明狀態(tài)的程序窗體。取消注解后再次運行,窗體再次消失。可見問題就出在這條命令上。

(5)問題的解決

問題既然出現(xiàn)了,那么就要去找解決問題的方法。上網(wǎng)一查,發(fā)現(xiàn)有許多帖子都顯示遇到同樣的問題,也有些帖子給出一些解決方法,但是在Windows 7下都解決不了窗體透明嵌入桌面的問題。也有一些帖子認為這是Windows 7系統(tǒng)或Visual Studio本身問題,問題看似無解了。

經(jīng)過多天毫無目標頭緒的修改,問題仍然沒有得到解決。近期機房有一門課程需要在Windows 10系統(tǒng)中安裝VMware虛擬機,并要求虛擬一個Windows 7系統(tǒng)。安裝完成后,抱著試試看的想法將軟件拷貝到虛擬機的Windows 7系統(tǒng)中,雙擊運行,眼前一亮,桌面右上角透明窗體顯示出現(xiàn)了??磥聿⒎侨缇W(wǎng)上帖子所說那樣無法實現(xiàn)。于是仔細對照虛擬機的Windows 7系統(tǒng)和實體Windows 7系統(tǒng)的各項設(shè)置和服務(wù),對比后發(fā)現(xiàn)Desktop Window Manager Session Manager(桌面窗體管理對話管理)服務(wù)是影響窗體透明嵌入桌面的根本原因。

解決方法是:軟件在Windows 7系統(tǒng)中運行時,在窗體嵌入桌面前,通過程序停止Desktop Window Manager Session Manager服務(wù),軟件結(jié)束運行前再啟動該服務(wù)。

4.3 ? VS2015中C#操控Windows服務(wù)接口的部分代碼

#region 停止一項服務(wù)

///

/// 停止一項服務(wù)

///

/// 服務(wù)名稱

public void StopService(String servicename)

{

try

{

sController = new ServiceController(servicename); // 服務(wù)控制變量指向?qū)?yīng)的服務(wù)

if (sController.Status != ServiceControllerStatus.Stopped) // 判別此服務(wù)項是否是停止狀態(tài)

{

sController.Stop(); // 停止服務(wù)

sController.WaitForStatus(ServiceControllerStatus.Stopped); // 等待服務(wù)停止

sController.Close(); // 切斷控制變量與服務(wù)的聯(lián)系

}

}

catch { }

}

#endregion

#region 啟動一項服務(wù)

///

/// 啟動一項服務(wù)

///

/// 服務(wù)名稱

public void StartService(String servicename)

{

try

{

sController = new ServiceController(servicename); // 服務(wù)控制變量指向?qū)?yīng)的服務(wù)

if (sController.Status == ServiceControllerStatus.Stopped) // 判別此服務(wù)項是否是已運行狀態(tài)

{

sController.Start(); // 啟動服務(wù)

sController.WaitForStatus(ServiceControllerStatus.Running); // 等待服務(wù)啟動完成

sController.Close(); // 切斷控制變量與服務(wù)的聯(lián)系

}

}

catch { }

}

#endregion

5 ? 結(jié)論(Conclusion)

基于WMI的機房信息可視化方案在本校機房管理中應(yīng)用后收到了一定效果。管理人員和任課教師通過它能夠了解并掌握每個分區(qū)系統(tǒng)信息,快速判別本分區(qū)是否滿足教學或考試要求。因此該方案在一定程度上幫助了機房管理員提高服務(wù)質(zhì)量和管理效率。

參考資料(References)

[1] Windows API參考手冊[DB/OL].http://www.office-cn.net/book/api/214.html,2017-8-24.

[2] 李泉.現(xiàn)代API通往架構(gòu)師之門[M].清華大學出版社,2018.

[3] 范文慶.Windows API開發(fā)詳解——函數(shù)、接口、編程實例[M].人民郵電出版社,2011.

[4] WMI簡介[DB/OL]. https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/introduction-to-wmi,2017-6-16.

[5] Marcin Policht.智慧東方工作室,譯.WMI技術(shù)指南[M].北京:機械工業(yè)出版社,2002.

[6] Nagel C.,Evjen B..李銘,譯.C#高級編程(第7版)[M].北京:清華大學出版社,2010.

[7] 明日科技.C#項目開發(fā)實戰(zhàn)入門(全彩版)[M].吉林:吉林大學出版社,2017.

[8] Bruce Johnson.張衛(wèi)華,裴洪文,譯.Visual Studio 2015高級編程(第6版)[M].北京:清華大學出版社,2016.

作者簡介:

嚴 ?強(1962-),男,本科,工程師.研究領(lǐng)域:工業(yè)控制,數(shù)據(jù)通信.

猜你喜歡
機房管理
高職高專院校計算機房管理與維護
試論開源云計算openstack在高校計算機機房中的應(yīng)用
計算機實訓室應(yīng)用桌面虛擬化技術(shù)初探
還原卡擴展功能在提高機房管理效率上的應(yīng)用
機房管理與維護淺談
多媒體機房管理及維護
關(guān)于機房云桌面管理的探索
基于“云計算”技術(shù)的校園機房建設(shè)初探
云計算技術(shù)在職業(yè)學校機房建設(shè)與管理中的思考
小議機房管理員在計算機教學中的作用