線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4155
推到 Plurk!
推到 Facebook!

Windows Service 方式監控 執行程式

答題得分者是:RootKit
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-13 17:32:55 IP:60.248.xxx.xxx 未訂閱
請問各位大大,

我用TService 去做一個監控 a.exe 是否有被執行的作用, 但無反應.
請教各位能否指導..提供方向.

[code cpp]
//---------------------------------------------------------------------------
void __fastcall TnxnAgent::ServiceExecute(TService *Sender)
{
while(!Terminated)
{
AppHandle = FindWindow("TApplication","TEST");
if(AppHandle == NULL)
{
ShellExecute(NULL,NULL,"D:\App.exe",NULL,NULL,SW_SHOW);
}

Sleep(1000);
ServiceThread->ProcessRequests(false);
}
}
//---------------------------------------------------------------------------
void __fastcall TnxnAgent::ServiceStart(TService *Sender, bool &Started)
{
Started = true;
}
//---------------------------------------------------------------------------

[/code]
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-14 09:16:03 IP:59.120.xxx.xxx 未訂閱
[code cpp]AppHandle = FindWindow(NULL,"TEST"); [/code]
------
~§~迷時師渡,悟了自渡~§~
編輯記錄
harpist 重新編輯於 2008-08-14 09:17:47, 註解 無‧
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-14 09:37:08 IP:60.248.xxx.xxx 未訂閱
我查工作管理員, 看到service 有把 程式(test.exe)執行, 但沒畫面出來. 而其使用者名稱欄位是"SYSTEM"

若直接點選 程式(text.exe), 有畫面出來, 而其使用者名稱欄位是 登入的帳號

請問我那兒的操作錯誤呢

===================引 用 harpist 文 章===================
[code cpp]AppHandle = FindWindow(NULL,"TEST"); [/code]
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-14 09:50:47 IP:61.222.xxx.xxx 訂閱
因為 Service 沒有桌面。
需要設置桌面 CreateProcess
lpDesktop
編輯記錄
RootKit 重新編輯於 2008-08-14 11:44:06, 註解 無‧
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-14 10:15:59 IP:60.248.xxx.xxx 未訂閱
CreateProcess(NULL,"D:\TEST.exe",NULL,NULL,true,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartupInfo,&ProcessInfo);
請問我這樣子用結果還是system, 要變動那一參數才能有畫面?
===================引 用 RootKit 文 章===================
因為 Server 沒有桌面。
需要設置桌面 CreateProcess
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-14 15:05:48 IP:59.120.xxx.xxx 未訂閱
如果你的作業系統是Vista 有可能會有這樣的情況,在 Vista 之前的 Windows 版本你的方法是可行的,
由於 Vista 有 Session 0 Isolation 的關係,所以登入的
Session 會看不到在 Session 0 執行 test.exe
的畫面
解決的方式就是將你的 test.exe 丟到登入的 Session 去執行

以下 API 你查一下,依列的順序使用就可以解決你的問題。
WTSGetActiveConsoleSessionId
WTSQueryUserToken
SetTokenInformation
CreateEnvironmentBlock
CreateProcessAsUser


===================引 用 kenbcb 文 章===================
我查工作管理員, 看到service 有把 程式(test.exe)執行, 但沒畫面出來. 而其使用者名稱欄位是"SYSTEM"

若直接點選 程式(text.exe), 有畫面出來, 而其使用者名稱欄位是 登入的帳號

請問我那兒的操作錯誤呢

===================引 用 harpist 文 章===================
[code cpp]AppHandle = FindWindow(NULL,"TEST"); [/code]
------
~§~迷時師渡,悟了自渡~§~
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-15 09:27:09 IP:60.248.xxx.xxx 未訂閱
是xp 的系統...所以不知那一點出錯了.

===================引 用 harpist 文 章===================
如果你的作業系統是Vista 有可能會有這樣的情況,在 Vista 之前的 Windows 版本你的方法是可行的,
由於 Vista 有 Session 0 Isolation 的關係,所以登入的
Session 會看不到在 Session 0 執行 test.exe
的畫面
解決的方式就是將你的 test.exe 丟到登入的 Session 去執行

以下 API 你查一下,依列的順序使用就可以解決你的問題。
WTSGetActiveConsoleSessionId
WTSQueryUserToken
SetTokenInformation
CreateEnvironmentBlock
CreateProcessAsUser


===================引 用 kenbcb 文 章===================
我查工作管理員, 看到service 有把 程式(test.exe)執行, 但沒畫面出來. 而其使用者名稱欄位是"SYSTEM"

若直接點選 程式(text.exe), 有畫面出來, 而其使用者名稱欄位是 登入的帳號

請問我那兒的操作錯誤呢

===================引 用 harpist 文 章===================
[code cpp]AppHandle = FindWindow(NULL,"TEST"); [/code]
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-08-15 10:02:21 IP:61.222.xxx.xxx 訂閱
搜 winsta0\\default
harpist
資深會員


發表:3
回覆:251
積分:430
註冊:2002-10-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-08-15 10:44:20 IP:59.120.xxx.xxx 未訂閱
如果是 XP 系統,單純要顯示畫面你原來的方式應該是OK的,你所執行的程式功能為何?有存取 Registy 嗎?
寫個單純畫面什麼都不做的程式試試看,我一般都直接用 ShellExecute 就可以了,除非有要存取 Registy 就
會 GetTokenByName 然後指定到 RootKit 兄提到的 winsta0\\default 使用CreateProcessAsUser 執行。

===================引 用 kenbcb 文 章===================
是xp 的系統...所以不知那一點出錯了.

===================引 用 harpist 文 章===================
如果你的作業系統是Vista 有可能會有這樣的情況,在 Vista 之前的 Windows 版本你的方法是可行的,
由於 Vista 有 Session 0 Isolation 的關係,所以登入的
Session 會看不到在 Session 0 執行 test.exe
的畫面
解決的方式就是將你的 test.exe 丟到登入的 Session 去執行

以下 API 你查一下,依列的順序使用就可以解決你的問題。
WTSGetActiveConsoleSessionId
WTSQueryUserToken
SetTokenInformation
CreateEnvironmentBlock
CreateProcessAsUser


===================引 用 kenbcb 文 章===================
我查工作管理員, 看到service 有把 程式(test.exe)執行, 但沒畫面出來. 而其使用者名稱欄位是"SYSTEM"

若直接點選 程式(text.exe), 有畫面出來, 而其使用者名稱欄位是 登入的帳號

請問我那兒的操作錯誤呢

===================引 用 harpist 文 章===================
[code cpp]AppHandle = FindWindow(NULL,"TEST"); [/code]
------
~§~迷時師渡,悟了自渡~§~
kenbcb
中階會員


發表:171
回覆:129
積分:60
註冊:2003-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-08-15 11:16:59 IP:60.248.xxx.xxx 未訂閱
只是單純畫面, 先做測試~~
我也有用 shellexecute 也有同樣問題, 才覺得有問題.

===================引 用 harpist 文 章===================
如果是 XP 系統,單純要顯示畫面你原來的方式應該是OK的,你所執行的程式功能為何?有存取 Registy 嗎?
寫個單純畫面什麼都不做的程式試試看,我一般都直接用 ShellExecute 就可以了,除非有要存取 Registy 就
會 GetTokenByName 然後指定到 RootKit 兄提到的 winsta0\\default 使用CreateProcessAsUser 執行。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-08-19 15:39:26 IP:61.222.xxx.xxx 訂閱
不是說了嗎。CreateProcess指定啟動桌面 lpDesktop 但有可能會權限不夠。
如果是在 2003 or vista 就行不通。必須透過 CreateProcessAsUser
系統時間:2024-04-26 15:28:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!