我需要從Windows服務啓動程序。該程序是一個用戶UI應用程序。此外,應用程序應該在特定用戶帳戶下啓動。如何從Windows服務啓動進程到當前登錄的用戶會話
的問題是,一個窗口服務會話#0中運行,但在用戶會話已記錄的是1,2等
所以,問題是:如何從一個窗口服務啓動的過程中這樣的它在當前登錄的用戶會話中運行的方式?
我強調,這個問題不是關於如何在特定帳戶下啓動進程(這很明顯 - Process.Start(new ProcessStartInfo(「..」){UserName = ..,Password = ..} ))。即使我安裝我的Windows以當前用戶帳戶運行,該服務仍將在會話#0中運行。 設置「允許服務與桌面交互」不起作用。
我的windows服務是基於.net的。
UPDATE: 首先,.NET在這裏沒有任何關係,它實際上是純粹的Win32的東西。 以下是我正在做的事情。下面的代碼是在我的窗口服務(通過P/Inkove使用Win32函數的C#,我跳過導入簽名,他們都在這裏是 - http://www.pinvoke.net/default.aspx/advapi32/CreateProcessWithLogonW.html):
var startupInfo = new StartupInfo()
{
lpDesktop = "WinSta0\\Default",
cb = Marshal.SizeOf(typeof(StartupInfo)),
};
var processInfo = new ProcessInformation();
string command = @"c:\windows\Notepad.exe";
string user = "Administrator";
string password = "password";
string currentDirectory = System.IO.Directory.GetCurrentDirectory();
try
{
bool bRes = CreateProcessWithLogonW(user, null, password, 0,
command, command, 0,
Convert.ToUInt32(0),
currentDirectory, ref startupInfo, out processInfo);
if (!bRes)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
catch (Exception ex)
{
writeToEventLog(ex);
return;
}
WaitForSingleObject(processInfo.hProcess, Convert.ToUInt32(0xFFFFFFF));
UInt32 exitCode = Convert.ToUInt32(123456);
GetExitCodeProcess(processInfo.hProcess, ref exitCode);
writeToEventLog("Notepad has been started by WatchdogService. Exitcode: " + exitCode);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
代碼呈上行「記事本已經啓動通過WatchdogService。Exitcode:「+ exitCode。 Exitcode是3221225794. 並沒有任何新的記事本啓動。 我錯在哪裏?
我不希望我的服務是交互式的(顯示任何UI),我只希望它能夠啓動另一個進程(在用戶會話中)。這有點不同,不是嗎? – Shrike 2010-11-25 15:23:35
@Shrike:如果你不想展示一個UI,那麼爲什麼僅僅在session 0中啓動這個過程還不夠?我認爲您需要添加更多關於爲什麼該流程需要交互式會話的細節,以及爲什麼建議的解決方法不適合您。 – 2010-11-25 16:01:54
有兩個角色:Windows服務和UI程序。服務器itseft不顯示UI,它只是啓動程序(作爲一個新進程)。程序_has_UI(並需要會話1)。我的服務是一種看門狗,定期「ping」程序並在出現錯誤時啓動/重啓。我在原帖中添加了一些說明 – Shrike 2010-11-25 17:37:14