masalah keamanan dengan CreateProcess API

Tujuan : Saya mencoba mengirim beberapa file dari klien saya ke server. Saya menggunakan "rsync" untuk mentransfer data. Saya menggunakan CreateProcess APi dan melewati jalur rsync beserta parameternya.

Kasus Positif: Ketika saya mengirim data dari drive lokal seperti "C:" di mana windows saya diinstal, metode di atas berfungsi dengan baik dan mentransfer data.

Masalah : Saat saya mencoba mengirim data dari drive yang dipetakan (drive jaringan bersama). CreateProcess selesai tetapi kesalahan yang saya dapatkan adalah rsync tidak dapat menemukan file. Perintah rsync yang sama, ketika saya menjalankan command prompt semua file berhasil ditransfer tanpa kesalahan apa pun tetapi gagal dalam mentransfer file dengan CreateProcess.

Kode :

    int CreateRsyncProcess(const wchar_t * ptrCommand)
    {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        SECURITY_ATTRIBUTES sap,sat,sao;
        HANDLE out;
        DWORD pwExit;

        //init the STARTUPINFO struct
        memset(&si,0,sizeof(si));
        si.cb=sizeof(si);

        wstring cmd = L"";
        cmd.append(ptrCommand);


        //proc sec attributes
        sap.nLength=sizeof(SECURITY_ATTRIBUTES);
        sap.lpSecurityDescriptor= NULL;
        sap.bInheritHandle=1;

        //thread sec attributes
        sat.nLength=sizeof(SECURITY_ATTRIBUTES);
        sat.lpSecurityDescriptor= NULL;
        sat.bInheritHandle=1;


        //create the proc
        if(!CreateProcess(NULL,(LPWSTR)cmd.c_str(),&sap,&sat,1,CREATE_NO_WINDOW,NULL,NULL,&si,&pi))
        {
            DWORD err = GetLastError();
            if(out != INVALID_HANDLE_VALUE)
                CloseHandle(out);

            return 1;
        }

        //wait till the proc ends

        WaitForSingleObject(pi.hProcess,INFINITE);

        GetExitCodeProcess(pi.hProcess,&pwExit);

        //close all
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        if(out != INVALID_HANDLE_VALUE)
            CloseHandle(out);
        TerminateProcess(pi.hProcess,0);


        return pwExit;

}

Rsync Cmd : "C:\Program Files\cwRsync\bin\rsync.exe" -cvriHPDkREL --no-implied-dirs --stats -e '"C:\Program Files\cwRsync\bin \ssh" -o StrictHostKeyChecking=no -i "C:\Program Files\cwRsync\bin\rsync-key"' "/cygdrive/Z/64Bit" [email protected]:~/6a90c592-2b3b-4088-8942- 2106776c863a/

Apakah ini terjadi karena masalah terkait keamanan atau masalah hak dengan CreateProcess atau hal lain? Tolong bantu karena saya terjebak dalam hal ini.

Terima kasih

EDIT: : Ini berfungsi dengan baik sebagai proses normal tetapi ketika saya menjalankannya di suatu layanan gagal. Jadi pada dasarnya masalahnya sekarang adalah layanan tidak mengakses jaringan berbagi. Adakah solusi untuk itu?


person singh    schedule 13.02.2014    source sumber
comment
Apakah Anda menjalankan proses sebagai Layanan?   -  person João Augusto    schedule 13.02.2014
comment
tidak sebagai proses normal   -  person singh    schedule 13.02.2014
comment
Cobalah tanpa CREATE_NO_WINDOW. Mungkin hanya mencoba menulis ke STDERR atau semacamnya.   -  person Ben    schedule 13.02.2014
comment
Coba konfigurasikan akun layanan sebagai Layanan Jaringan. halaman ini dapat membantu.   -  person wacky6    schedule 13.02.2014
comment
layanan ini berjalan di bawah akun admin, jika saya menjalankannya sebagai layanan jaringan, beberapa hal tidak akan berfungsi   -  person singh    schedule 13.02.2014
comment
Jadi apakah ini berjalan sebagai layanan?   -  person João Augusto    schedule 13.02.2014
comment
ya..itu berjalan sebagai layanan di bawah akun pengguna   -  person singh    schedule 20.02.2014


Jawaban (3)


Karena tampaknya Anda menjalankan Layanan, Anda mungkin perlu memuat lingkungan untuk memiliki akses ke folder yang dipetakan.

Sesuatu seperti ini.

    DWORD dwIdCurrentSession = 0xFFFFFFFF;

    WTS_SESSION_INFO* pSessionInfo = NULL;          
    DWORD dwSessionsCount = 0;
    if(WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionsCount))
    {   
        for(int i=0; i<(int)dwSessionsCount; i++)
        {
            WTS_SESSION_INFO &si = pSessionInfo[i];
            if(si.State == WTSActive)
            {                                                       
                dwIdCurrentSession = si.SessionId;
                break;
            }
        }

        WTSFreeMemory(pSessionInfo);    
    }

    if(dwIdCurrentSession != 0xFFFFFFFF)
    {
        HANDLE hLoggedOnUserToken = NULL;           
        // Get Session User Token   
        if(WTSQueryUserToken(dwIdCurrentSession, &hLoggedOnUserToken))                          
        {                   
            LPVOID lpEnviroment = NULL;
            if(CreateEnvironmentBlock(&lpEnviroment, hLoggedOnUserToken, false))
            {               
                STARTUPINFO si;
                PROCESS_INFORMATION pi;

                ZeroMemory( &si, sizeof(si) );
                si.cb = sizeof(si);
                ZeroMemory( &pi, sizeof(pi) );

                // Create Process
                if(CreateProcessAsUser(hLoggedOnUserToken,
                    NULL,
                    (LPWSTR)cmd.c_str(),
                    NULL,
                    NULL,
                    FALSE,
                    CREATE_UNICODE_ENVIRONMENT,
                    lpEnviroment,
                    NULL,
                    &si,
                    &pi )
                ) 
                {   
                    // Wait for finish......

                    // Clean up
                    CloseHandle( pi.hProcess );
                    CloseHandle( pi.hThread );                                  
                }

                DestroyEnvironmentBlock(lpEnviroment);
            }

            CloseHandle(hLoggedOnUserToken);    
        }
    }
person João Augusto    schedule 13.02.2014
comment
aku akan mencoba dan memberitahumu - person singh; 14.02.2014
comment
kode ini berfungsi ketika saya menjalankan layanan di bawah akun sistem tetapi gagal ketika saya menjalankan layanan di bawah akun pengguna - person singh; 20.02.2014
comment
WTSQueryUserToken hanya berfungsi untuk akun LocalSystem. - person João Augusto; 20.02.2014
comment
Info berguna untuk masalah Anda msdn .microsoft.com/en-us/library/windows/desktop/ - person João Augusto; 20.02.2014

Drive yang dipetakan adalah per sesi - layanan dalam sesi terisolasi tidak dapat mengakses drive yang dipetakan dalam sesi pengguna. Anda harus memetakan drive dalam sesi layanan, atau menggunakan jalur UNC (bukan huruf drive yang dipetakan) dan memberikan akses kepada pengguna layanan untuk berbagi.

person nobody    schedule 13.02.2014

Sistem operasi spesifik apa yang Anda gunakan, misalnya Windows 7 32-bit, Windows 7 64-bit, dll? Juga, apakah Anda mengaktifkan UAC? Jika Anda mengaktifkan UAC, apakah masalahnya akan hilang saat Anda menjalankan aplikasi sebagai administrator.

Tergantung pada jawaban Anda terhadap pertanyaan-pertanyaan ini, saya mungkin dapat memberikan bantuan lebih lanjut. Saya harus melakukan penelitian.

Saat ini, jika UAC memang menjadi masalah Anda, satu-satunya saran saya adalah Anda menyelidiki kemungkinan menggunakan ShellExecuteEx sebagai gantinya. Fungsi RunElevated ditemukan di Mengendarai UAC Vista lift, naik dan turun mungkin berguna bagi Anda. Demi kenyamanan saya akan menyertakan fungsinya di sini.

BOOL RunElevated(
  HWND hwnd, LPCTSTR pszPath,
  LPCTSTR pszParameters = NULL, LPCTSTR pszDirectory = NULL)
{
  SHELLEXECUTEINFO shex;
  memset( &shex, 0, sizeof( shex) );

  shex.cbSize = sizeof(SHELLEXECUTEINFO);
  shex.fMask = 0;
  shex.hwnd = hwnd;
  shex.lpVerb = _T("runas");
  shex.lpFile = pszPath;
  shex.lpParameters = pszParameters;
  shex.lpDirectory = pszDirectory;
  shex.nShow = SW_NORMAL;
  return ::ShellExecuteEx(&shex);
}

Jika menggunakan ShellExecuteEx bukan suatu pilihan, Anda juga dapat mencoba fungsi CreateProcessElevated yang ditemukan di Vista UAC: Panduan Definitif.

person Ben Key    schedule 13.02.2014