用vbs確定腳本正在哪一個(gè)帳戶(hù)下運(yùn)行
更新時(shí)間:2007年03月26日 00:00:00 作者:
問(wèn):
您好,腳本專(zhuān)家!如何確定腳本正在哪一個(gè)帳戶(hù)下運(yùn)行?
-- KW
答:
您好,KW。您知道,自從我們以各種托辭而開(kāi)設(shè)這一專(zhuān)欄以來(lái)已有一段時(shí)間了,對(duì)于我們而言,這并非易事:畢竟,尋找托辭是我們這些腳本專(zhuān)家的拿手好戲。明確了這一點(diǎn),那就讓我們以我們最喜歡的一個(gè)托辭開(kāi)始吧:我們將向您介紹的腳本只在 Windows XP 和 Windows Server 2003 上有效。我們將向您介紹使得該腳本在 Windows 2000 上同樣有效的方法,但后者絕對(duì)不及前者好。
噢,是的:現(xiàn)在感覺(jué)該方法不錯(cuò)。
好了,不找托辭了(至少是現(xiàn)在)。還是讓我們討論一下腳本吧。該腳本如下:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
For Each objProcess in colProcessList
If InStr(objProcess.CommandLine, "test.vbs") Then
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
Wscript.Echo "This script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
End If
Next
正如您所看到的那樣,雖然也可很容易地針對(duì)遠(yuǎn)程計(jì)算機(jī)運(yùn)行此腳本,但我們還是首先連接至本地計(jì)算機(jī)上的 WMI 服務(wù)。(是的,我們的確說(shuō)過(guò)很多次這樣的話了。但這并不是托辭,而只是陳述事實(shí):幾乎所有的 WMI 腳本針對(duì)遠(yuǎn)程計(jì)算機(jī)的運(yùn)行效果都與它們?cè)诒镜赜?jì)算機(jī)上的運(yùn)行效果一樣好。我們確實(shí)時(shí)常在談?wù)撘恍?shí)質(zhì)內(nèi)容?。?nbsp;
接下來(lái)我們遇到了下面這行代碼:
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
您可能已經(jīng)猜到我們需要使用 Win32_Process 類(lèi)來(lái)執(zhí)行我們的任務(wù),這是因?yàn)?nbsp;Win32_Process 是用來(lái)跟蹤計(jì)算機(jī)上當(dāng)前運(yùn)行的所有進(jìn)程的 WMI 類(lèi)。當(dāng)然,我們并不關(guān)心計(jì)算機(jī)上運(yùn)行的所有進(jìn)程,我們只關(guān)心腳本。正因如此,我們添加了一個(gè) Where 子句,該子句將只返回以下兩個(gè) Windows 腳本宿主的實(shí)例的信息:Cscript.exe 和 Wscript.exe。
注意:是的,我們本來(lái)可以以稍有不同的方式來(lái)編寫(xiě)此腳本的,或許那樣會(huì)在進(jìn)程中省下一兩行代碼。我們之所以選擇了此方法,是因?yàn)樵摲椒ㄅc我們?cè)?nbsp;Windows 2000 上執(zhí)行此任務(wù)的方法更相似。
發(fā)出查詢(xún)后,我們建立一個(gè) For Each 循環(huán),以遍歷返回的集合。在本例中,我們?cè)噲D確定名為 Test.vbs 的腳本的所有者。因此,我們需要檢查每個(gè)腳本,以查看它的名稱(chēng)是否為 Test.vbs。我們?nèi)绾稳プ瞿??通過(guò)使用下面這行代碼:
If InStr(objProcess.CommandLine, "test.vbs") Then
我們此處要做的是使用 InStr 函數(shù)來(lái)確定是否可在屬性 CommandLine 中的某個(gè)位置找到字符串 test.vbs。什么是 CommandLine 屬性?簡(jiǎn)單地說(shuō),它就是從命令提示符啟動(dòng)腳本所需的命令字符串。例如,CommandLine 可能為下列內(nèi)容:
C:\Scripts\Test Scripts\Test.vbs
由于我們假定不存在名為 MyTest.vbs 的腳本,因此我們將檢查 test.vbs。如果您擔(dān)心此類(lèi)名稱(chēng)沖突,那么,我們可以只使用 InStr 并針對(duì)類(lèi)似 \test.vbs 的字符串進(jìn)行測(cè)試。這是一個(gè)您必須決定的問(wèn)題。
如果確實(shí)可以在 CommandLine 值中找到我們的目標(biāo)字符串,則我們將調(diào)用 GetOwner 方法來(lái)找出進(jìn)程的“所有者”(即,腳本在其下運(yùn)行的帳戶(hù)的名稱(chēng)):
objProcess.GetOwner(strNameOfUser,strUserDomain)
我們需要使用 GetOwner 傳遞一對(duì)“輸出參數(shù)”。輸出參數(shù)就是方法將用一個(gè)值對(duì)其進(jìn)行填充的變量(由我們自己來(lái)命名該變量)。這里,我們將傳遞名為 strNameOfUser 和 strUserDomain 的變量。反過(guò)來(lái),GetOwner 將用戶(hù)名稱(chēng)和擁有進(jìn)程的用戶(hù)所在的域賦值給這兩個(gè)變量。
此時(shí)我們所要做的就是回顯返回信息:
Wscript.Echo "This script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
那么,我們?yōu)楹尾荒茉?nbsp;Windows 2000 上運(yùn)行此腳本呢?實(shí)際上,有充分的理由來(lái)對(duì)此進(jìn)行解釋?zhuān)褐挥?nbsp;Windows XP 和 Windows Server 2003 上才有 CommandLine 屬性。在其他版本的 Windows 上,我們無(wú)法標(biāo)識(shí)各個(gè)腳本;最好的方法就是為恰好正在運(yùn)行的 Cscript.exe 和 Wscript.exe 的所有實(shí)例返回所有者信息。如果只有一個(gè)腳本在運(yùn)行,也同樣沒(méi)有問(wèn)題:CScript.exe 或 Wscript.exe 的單個(gè)實(shí)例必須為該單個(gè)腳本。換句話說(shuō),這就意味著腳本宿主進(jìn)程的所有者也是腳本進(jìn)程的所有者。如果運(yùn)行了多個(gè)腳本,則是另外一回事了。如果確實(shí)為此種情況,您最好是說(shuō):“嗯,Ken Myer 擁有其中的一個(gè)腳本,盡管我們不知道具體是哪一個(gè)。他未擁有的某個(gè)腳本恰好為 Pilar Ackerman 所擁有。
不,沒(méi)有那么好。不過(guò)事實(shí)就是這樣。(是的,這是一個(gè)托辭。盡管有點(diǎn)漏洞百出,但它仍是一個(gè)托辭。)
下面是 Windows 2000 解決方案(也可以說(shuō)是:部分解決方案):
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
For Each objProcess in colProcessList
objProcess.GetOwner strNameOfUser,strUserDomain
Wscript.Echo "A script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
Next
您好,腳本專(zhuān)家!如何確定腳本正在哪一個(gè)帳戶(hù)下運(yùn)行?
-- KW
答:
您好,KW。您知道,自從我們以各種托辭而開(kāi)設(shè)這一專(zhuān)欄以來(lái)已有一段時(shí)間了,對(duì)于我們而言,這并非易事:畢竟,尋找托辭是我們這些腳本專(zhuān)家的拿手好戲。明確了這一點(diǎn),那就讓我們以我們最喜歡的一個(gè)托辭開(kāi)始吧:我們將向您介紹的腳本只在 Windows XP 和 Windows Server 2003 上有效。我們將向您介紹使得該腳本在 Windows 2000 上同樣有效的方法,但后者絕對(duì)不及前者好。
噢,是的:現(xiàn)在感覺(jué)該方法不錯(cuò)。
好了,不找托辭了(至少是現(xiàn)在)。還是讓我們討論一下腳本吧。該腳本如下:
復(fù)制代碼 代碼如下:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
For Each objProcess in colProcessList
If InStr(objProcess.CommandLine, "test.vbs") Then
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
Wscript.Echo "This script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
End If
Next
正如您所看到的那樣,雖然也可很容易地針對(duì)遠(yuǎn)程計(jì)算機(jī)運(yùn)行此腳本,但我們還是首先連接至本地計(jì)算機(jī)上的 WMI 服務(wù)。(是的,我們的確說(shuō)過(guò)很多次這樣的話了。但這并不是托辭,而只是陳述事實(shí):幾乎所有的 WMI 腳本針對(duì)遠(yuǎn)程計(jì)算機(jī)的運(yùn)行效果都與它們?cè)诒镜赜?jì)算機(jī)上的運(yùn)行效果一樣好。我們確實(shí)時(shí)常在談?wù)撘恍?shí)質(zhì)內(nèi)容?。?nbsp;
接下來(lái)我們遇到了下面這行代碼:
復(fù)制代碼 代碼如下:
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
您可能已經(jīng)猜到我們需要使用 Win32_Process 類(lèi)來(lái)執(zhí)行我們的任務(wù),這是因?yàn)?nbsp;Win32_Process 是用來(lái)跟蹤計(jì)算機(jī)上當(dāng)前運(yùn)行的所有進(jìn)程的 WMI 類(lèi)。當(dāng)然,我們并不關(guān)心計(jì)算機(jī)上運(yùn)行的所有進(jìn)程,我們只關(guān)心腳本。正因如此,我們添加了一個(gè) Where 子句,該子句將只返回以下兩個(gè) Windows 腳本宿主的實(shí)例的信息:Cscript.exe 和 Wscript.exe。
注意:是的,我們本來(lái)可以以稍有不同的方式來(lái)編寫(xiě)此腳本的,或許那樣會(huì)在進(jìn)程中省下一兩行代碼。我們之所以選擇了此方法,是因?yàn)樵摲椒ㄅc我們?cè)?nbsp;Windows 2000 上執(zhí)行此任務(wù)的方法更相似。
發(fā)出查詢(xún)后,我們建立一個(gè) For Each 循環(huán),以遍歷返回的集合。在本例中,我們?cè)噲D確定名為 Test.vbs 的腳本的所有者。因此,我們需要檢查每個(gè)腳本,以查看它的名稱(chēng)是否為 Test.vbs。我們?nèi)绾稳プ瞿??通過(guò)使用下面這行代碼:
If InStr(objProcess.CommandLine, "test.vbs") Then
我們此處要做的是使用 InStr 函數(shù)來(lái)確定是否可在屬性 CommandLine 中的某個(gè)位置找到字符串 test.vbs。什么是 CommandLine 屬性?簡(jiǎn)單地說(shuō),它就是從命令提示符啟動(dòng)腳本所需的命令字符串。例如,CommandLine 可能為下列內(nèi)容:
C:\Scripts\Test Scripts\Test.vbs
由于我們假定不存在名為 MyTest.vbs 的腳本,因此我們將檢查 test.vbs。如果您擔(dān)心此類(lèi)名稱(chēng)沖突,那么,我們可以只使用 InStr 并針對(duì)類(lèi)似 \test.vbs 的字符串進(jìn)行測(cè)試。這是一個(gè)您必須決定的問(wèn)題。
如果確實(shí)可以在 CommandLine 值中找到我們的目標(biāo)字符串,則我們將調(diào)用 GetOwner 方法來(lái)找出進(jìn)程的“所有者”(即,腳本在其下運(yùn)行的帳戶(hù)的名稱(chēng)):
objProcess.GetOwner(strNameOfUser,strUserDomain)
我們需要使用 GetOwner 傳遞一對(duì)“輸出參數(shù)”。輸出參數(shù)就是方法將用一個(gè)值對(duì)其進(jìn)行填充的變量(由我們自己來(lái)命名該變量)。這里,我們將傳遞名為 strNameOfUser 和 strUserDomain 的變量。反過(guò)來(lái),GetOwner 將用戶(hù)名稱(chēng)和擁有進(jìn)程的用戶(hù)所在的域賦值給這兩個(gè)變量。
此時(shí)我們所要做的就是回顯返回信息:
Wscript.Echo "This script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
那么,我們?yōu)楹尾荒茉?nbsp;Windows 2000 上運(yùn)行此腳本呢?實(shí)際上,有充分的理由來(lái)對(duì)此進(jìn)行解釋?zhuān)褐挥?nbsp;Windows XP 和 Windows Server 2003 上才有 CommandLine 屬性。在其他版本的 Windows 上,我們無(wú)法標(biāo)識(shí)各個(gè)腳本;最好的方法就是為恰好正在運(yùn)行的 Cscript.exe 和 Wscript.exe 的所有實(shí)例返回所有者信息。如果只有一個(gè)腳本在運(yùn)行,也同樣沒(méi)有問(wèn)題:CScript.exe 或 Wscript.exe 的單個(gè)實(shí)例必須為該單個(gè)腳本。換句話說(shuō),這就意味著腳本宿主進(jìn)程的所有者也是腳本進(jìn)程的所有者。如果運(yùn)行了多個(gè)腳本,則是另外一回事了。如果確實(shí)為此種情況,您最好是說(shuō):“嗯,Ken Myer 擁有其中的一個(gè)腳本,盡管我們不知道具體是哪一個(gè)。他未擁有的某個(gè)腳本恰好為 Pilar Ackerman 所擁有。
不,沒(méi)有那么好。不過(guò)事實(shí)就是這樣。(是的,這是一個(gè)托辭。盡管有點(diǎn)漏洞百出,但它仍是一個(gè)托辭。)
下面是 Windows 2000 解決方案(也可以說(shuō)是:部分解決方案):
復(fù)制代碼 代碼如下:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where " & _
"Name = 'cscript.exe' or Name = 'wscript.exe'")
For Each objProcess in colProcessList
objProcess.GetOwner strNameOfUser,strUserDomain
Wscript.Echo "A script is running under the account belonging to " _
& strUserDomain & "\" & strNameOfUser & "."
Next
相關(guān)文章
VBS 生成不重復(fù)隨機(jī)數(shù)代碼[0-10]
VBS 生成不重復(fù)隨機(jī)數(shù)代碼[0-10]2009-12-12vbscript獲取文件的創(chuàng)建時(shí)間、最后修改時(shí)間和最后訪問(wèn)時(shí)間的方法
這篇文章主要介紹了vbscript獲取文件的創(chuàng)建時(shí)間、最后修改時(shí)間和最后訪問(wèn)時(shí)間的方法,本文通過(guò)FileSystemObject對(duì)象實(shí)現(xiàn),需要的朋友可以參考下2014-08-08雷客圖 站長(zhǎng)安全助手 vbs版代碼(asp 木馬查找)
雷客圖ASP站長(zhǎng)安全助手vbs版 使用說(shuō)明2009-07-07清除垃圾的VBS文件 自動(dòng)查找多個(gè)盤(pán)
可以刪除.tmp ._mp .log .gid .chk .old file文件和 temp,recent,cookis,recycled,prefetch,and "Temporary Internet Files"文件夾。2009-09-09