none
開發AP無法在Vista跟Win7正常執行 RRS feed

  • 問題

  • 問題:

    Print Driver(SDK開發的)利用了 CreateProcess()”呼叫GLP_AP(MFC開發),但在呼叫程序完成後卻發現被OS(VistaWin7)給擋在外面而不能使用?!

    如何發現的呢è是經由工作管理員觀察到~

    而在工作管理員內部有處理程序這頁面,其內部有一個欄位是使用者欄位,若這欄位表明的是”System”則會被擋在外頭不讓User使用,若這欄位表明的是User”則是可以用的不會被檔在外面。

            SystemUser不同之處在於~

    System是由OS本身所觸發程式之動作。

    User是由使用者自己去點選程式之動作。

    另外~ GLP_AP(MFC開發)放置的地方在”\\ system32\spool\drivers\w32x86\3”

    測試過

    1.          將使用者帳戶通知狀態成最低權限

    2.          啓動”程式相容”之功能來啓動AP

    3.          設定”防火牆”

    4.          關閉Interaction Services Detection之功能

    5.          停止Windows Defender功能

    6.  停止Application Information功能 

    請問~~該如何解

                                                         謝謝

    2010年4月1日 上午 09:00

解答

  • 看起來Token取錯對象了, 因為你的  GCC還是System 也就是運行在Session 0

    你可以參考以下這篇文, 取得正確的Token, 先這樣試試

    http://bbs.znpc.net/redirect.php?tid=4166&goto=lastpost


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 一黑洞一 2010年4月6日 上午 09:41
    2010年4月3日 上午 06:01

所有回覆

  • 有試過在相容性中勾選 "以系統管理員身份執行此程式" 嗎 ?
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月1日 上午 09:46
  • 謝謝您的回覆~~

    有的

            就是在GLP_AP.EXE按右鍵的內容,找到"相容性"頁面最下方的"以系統管理員身份執行此程式"功能, 這我有試過,但還是不能開啓^^"

    2010年4月1日 上午 09:59
  • 看起來是因為 Windows Vista和Windows 7的session 0 Isolation的關係

    試看看把 CreateProccess 改為使用 CreateProcessAsUser Method看看

    請參閱 MSDN文件庫

    [CreateProcessAsUser Function ]


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年4月1日 上午 10:16
  • 謝謝大大回覆:

            ~那就是說不是OS(VistaWin7)設定上或是其他問題哦~

            程式Coding方面的問題嗎!?

            但經由你所指導的方向去測試~但還是沒成功~~

    方式如下:

                                    bRet = LogonUser(

                                                 L"GCC",

                                                 NULL,

                                                 L"GCC",

                                                 LOGON32_LOGON_INTERACTIVE,

                                                 LOGON32_PROVIDER_DEFAULT,

                                                 &hToken

                                                 );

                                    //

                                    // start the process

                                    //

                                    bRet = CreateProcessAsUser(

                                                 hToken,

                                                 L" GLP_AP .exe",

                                                 NULL,

                                                 NULL,

                                                 NULL,

                                                 FALSE,

                                                 NORMAL_PRIORITY_CLASS,

                                                 NULL,

                                                 NULL,

                                                 &si,

                                                 &pi

                                                 );

    我的經驗不足請大大們指導一下。

                                    謝謝

    2010年4月2日 上午 07:13
  • 看起來Token取錯對象了, 因為你的  GCC還是System 也就是運行在Session 0

    你可以參考以下這篇文, 取得正確的Token, 先這樣試試

    http://bbs.znpc.net/redirect.php?tid=4166&goto=lastpost


    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 一黑洞一 2010年4月6日 上午 09:41
    2010年4月3日 上午 06:01
  • 謝謝大大回覆:

                   

    謝謝您提供相關資訊給我,此問題也己解決了。我是利用了他們(

                  if(!GetTokenByName(hToken,"EXPLORER.EXE")){

      return FALSE;

    }

    才能真正在Win7跟Vista上的取到User mode來啓動GLP_AP(MFC開發)

    AP也附上code給有需要的人參考

    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()

    {

            TCHAR  awExecuteFile[512];

            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");

            GetSystemDirectory(awExecuteFile, 512);

            strcat(awExecuteFile, "\\spool\\drivers\\w32x86\\3\\GLP_AP.exe ");

     

     

            BOOL bResult = CreateProcessAsUser(

                                       hToken,

                                       awExecuteFile,

                                       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;

    }

     

    2010年4月6日 上午 09:48