用vbs確定指令碼正在哪乙個帳戶下執行

2022-09-24 09:36:10 字數 3663 閱讀 5250

問:

您好,指令碼專家!如何確定指令碼正在哪乙個帳戶下執行?

-- kw

答: 您好,kw。您知道,自從我們以各種託辭而開設這一專欄以來已有一段時間了,對於我們而言,這並非易事:畢竟,尋找託辭是我們這些指令碼專家的拿手好戲。明確了這一點,那就讓我們以我們最喜歡的乙個託辭開始吧:我們將向您介紹的指令碼只在 windows xp 和 windows server 2003 上有效。我們將向您介紹使得該指令碼在 windows 2000 上同樣有效的方法,但後者絕對不及前者好。

噢,是的:現在感覺該方法不錯。

好了,不找託辭了(至少是現在)。還是讓我們討論一下指令碼吧。該指令碼如下:

複製** **如下:

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 

正如您所看到的那樣,雖然也可很容易地針對遠端計算機執行此指令碼,但我們還是首先連線至本地計算機上的 wmi 服務。(是的,我們的確說過很多次這樣的話了。但這並不是託辭,而只是陳述事實:幾乎所有的 wmi 指令碼針對遠端計算機的執行效果都與它們在本地計算機上的執行效果一樣好。我們確實時常在談論一些實質內容!) 

接下來我們遇到了下面這行**:

複製** **如下:

set colprocesslist = objwmiservice.execquery("select * from win32_process where " & _ 

"name = 'cscript.exe' or name = 'wscript.exe'") 

您可能已經猜到我們需要使用 win32_process 類來執行我們的任務,這是因為 win32_process 是用來跟蹤計算機上當前執行的所有程序的 wmi 類。當然,我們並不關心計算機上執行的所有程序,我們只關心指令碼。正因如此,我們新增了乙個 where 子句,該子句將只返回以下兩個 windows 指令碼宿主的例項的資訊:cscript.exe 和 wscript.exe。

注意:是的,我們本來可以以稍有不同的方式來編寫此指令碼的,或許那樣會在程序中省下一兩行**。我們之所以選擇了此方法,是因為該方法與我們在 windows 2000 上執行此任務的方法更相似。

發出查詢後,我們建立乙個 for each 迴圈,以遍歷返回的集合。在本例中,我們試圖確定名為 test.vbs 的指令碼的所有者。因此,我們需要檢查每個指令碼,以檢視它的名稱是否為 test.vbs。我們如何去做呢?通過使用下面這行**:

if instr(objprocess.commandline, "test.vbs") then

我們www.cppcns.com此處要做的是使用 instr 函式來確定是否可在屬性 commandline 中的某個位置找到字串 test.vbs。什麼是 commandline 屬性?簡單地說,它就是從命令提示符啟動指令碼所需的命令字串。例如,commandline 可能為下列內容:

c:\scripts\test scri程式設計客棧pts\test.vbs

由於我們假定不存在名為 mytest.vbs 的指令碼,因此我們將檢查 test.vbs。如果您擔心此類名稱衝突,那麼,我們可以只使用 instr 並針對類似 \test.vbs 的字串進行測試。這是乙個您必須決定的問題。

如果確實可以在 commandline 值中找到我們的目標字串,則我們將呼叫 getowner 方法來找出程序的「所有者」(即,指令碼在其下執行的帳戶的名稱):

objprocess.getowner(strnameofuser,struserdomain)

我們需要使用 getowner 傳遞一對「輸出引數」。輸出引數就是方法將用乙個值對其進行填充的變數(由我們自己來命名該變數)。這裡,我們將傳遞名為 strnameofuser 和 struserdomain 的變數。反過來,getowner 將使用者名稱和擁有程序的使用者所在的域賦值給這兩個變數。

此時我們所要做的就是回顯返回資訊:

wscript.echo "this script is running under the account belonging to " _ 

& struserdomain & "\" & strnameofuser & "."

那麼,我們為何不能在 windows 2000 上執行此指令碼呢?實際上,有充分的理由來對此進行解釋:只有 windows xp 和 windows server 2003 上才有 commandline 屬性。在其他版本的 windows 上,我們無法標識各個指令碼;最好的方法就是為恰好正在執行的 cscript.exe 和 wscript.exe 的所有例項返回所有者資訊。如果只有乙個指令碼在執行,也同樣沒有問題:cscript.exe 或 wscript.exe 的單個例項必須為該單個指令碼。換句話說,這就意味著指令碼宿主程序的所有者也是指令碼程序的所有者。如果執行了多個指令碼,則是另外一回事了。如果確實為此種情況,您最好是說:「嗯,ken myer 擁有其中的乙個指令碼,儘管我們不知道具體是哪乙個。他未擁有的某個指令碼恰好為 pilar ackerman 所擁有。

不,沒有那麼好。不過事實就是這樣。(是的,這是乙個託辭。儘管有點漏洞百出,但它仍是乙個託辭。)

下面是 windows 2000 解決方案(也可以說是:部分解決方案):

複製** **如下:

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 & "\" & strname程式設計客棧ofuser & "." 

next 

本文標題: 用vbs確定指令碼正在哪乙個帳戶下執行

本文位址:

檢視指定程序執行在哪乙個CPU

比如機器有2個cpu,某程序一直在這2個cpu切換,使用以下命令檢視該程序此刻執行在哪個cpu上 ps o pid,psr,comm p pid號 例如 pid psr command 分別代表 程序號 執行的cpu號 執行的程式 linux shijinhua self ps o pid,psr,...

電腦桌面便簽用哪乙個?

桌面便簽軟體是很多職場人士都在用的便簽軟體,工作中的瑣事太多,全記在腦子裡一件不忘根本不可能。如果有一款好用的便簽桌面便簽幫助自己記事,可以給大腦減壓,讓自己靜下心來,去思考更重要的事情。電腦桌面便簽種類有很多,大家可以根據自己的使用習慣進行挑選。我用的桌面便簽軟體是敬業籤,敬業籤非常適合職場人士使...

Sign in Vs Log in 應該寫哪乙個?

如果你看過 瞬間之美 你就知道有一種病症叫 login綜合症 每個人都要有點可愛的怪癖,關於login sign in的糾結就算是其中一種。作者robert hoekman,jr.認為login是乙個錯誤的用法,它不是乙個動作,而是乙個名字,不應該用作 登入 的意思。其實從沒糾結過login和sig...