我设计了一个守护程序(是service),功能是定期检查服务器程序是否还在运行,不在运行就重启服务器。我的服务器程序是有界面的,在本机上用service启动服务器程序,启动后是可以看到界面的。但是当我在电信托管的机器上通过远程界面用service启动服务程序,却看不到这个界面,我注意到启动的服务器程序在'程序管理器'中的用户名是‘system’,不知道和这个有没有关系?托管机器是windows2003,本机是winxp sp2。另外,我在局域网内通过远程桌面启动也可以看到界面。请各位大侠帮忙解答,不胜感激!!!

解决方案 »

  1.   

    becuse your service is running with the System account , if you want to  show a  UI to the desktop for a user, should setup the account to Administrator or other account .Make sure you did it . 
    More questions can be inqured , My name is NetDNA,your best advocator
      

  2.   

    啟動進程時指定進程的桌面
    PROCESS_INFORMATION pi;
    STARTUPINFO sti;
    ZeroMemory(&sti,sizeof(sti));
    sti.cb=sizeof(sti);
    sti.lpDesktop="winsta0\\default";
    CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);
      

  3.   

    到现场用service启动看看---------------------------这倒是可以试一下,是需要排除操作系统的因素
      

  4.   

    啟動進程時指定進程的桌面
    PROCESS_INFORMATION pi;
    STARTUPINFO sti;
    ZeroMemory(&sti,sizeof(sti));
    sti.cb=sizeof(sti);
    sti.lpDesktop="winsta0\\default";
    CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);---------------------试过了,也不行
      

  5.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=202006
      

  6.   

    把你的服務程序用SetThreadDesktop切換到default桌面試試,我以前也做過這樣的程序,在服務中用CreateProcess创建新进程,可以看到它的界面的.
    用的就是下列方法:
    PROCESS_INFORMATION pi;
    STARTUPINFO sti;
    ZeroMemory(&sti,sizeof(sti));
    sti.cb=sizeof(sti);
    sti.lpDesktop="winsta0\\default";
    CreateProcess(strCmd,NULL,NULL,NULL,FALSE,0,NULL,NULL,&sti,&pi);
      

  7.   

    你用的时候直接:
    RunProcess("C:\\WINDOWS\\NOTEPAD.EXE");就可以了。
    //////////////////////////////////
    BOOL GetTokenByName(HANDLE &hToken,LPSTR lpName)
    {
    if(!lpName)
    {
    return FALSE;
    }
    HANDLE         hProcessSnap = NULL; 
        BOOL           bRet      = FALSE; 
        PROCESSENTRY32 pe32      = {0}; 

        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (hProcessSnap == INVALID_HANDLE_VALUE) 
            return (FALSE); 

        pe32.dwSize = sizeof(PROCESSENTRY32); 

        if (Process32First(hProcessSnap, &pe32)) 
        {
            do 
            {
    if(!strcmp(_strupr(pe32.szExeFile),_strupr(lpName)))
    {
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,
    FALSE,pe32.th32ProcessID);
    bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken);
    CloseHandle (hProcessSnap); 
    return (bRet);
    }
            } 
            while (Process32Next(hProcessSnap, &pe32)); 
            bRet = TRUE; 
        } 
        else 
            bRet = FALSE;

        CloseHandle (hProcessSnap); 
        return (bRet);
    }BOOL RunProcess(LPCSTR lpImage)
    {
    if(!lpImage)
    {
    return FALSE;
    }
    HANDLE hToken;
    if(!GetTokenByName(hToken,"EXPLORER.EXE"))
    {
    return FALSE;
    }
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb= sizeof(STARTUPINFO);
    si.lpDesktop = TEXT("winsta0\\default");

    BOOL bResult = CreateProcessAsUser(hToken,lpImage,NULL,NULL,NULL,
    FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
    CloseHandle(hToken);
    if(bResult)
    {
    OutputDebugString("CreateProcessAsUser ok!\r\n");
    }
    else
    {
    OutputDebugString("CreateProcessAsUser false!\r\n");
    }
    return bResult;
    }