วัตถุประสงค์ : ฉันกำลังพยายามส่งไฟล์บางไฟล์จากไคลเอนต์ของฉันไปยังเซิร์ฟเวอร์ ฉันใช้ "rsync" เพื่อถ่ายโอนข้อมูล ฉันใช้ CreateProcess API และส่งเส้นทาง rsync พร้อมกับพารามิเตอร์
กรณีที่เป็นบวก: เมื่อฉันส่งข้อมูลจากไดรฟ์ในเครื่อง เช่น "C:" คือตำแหน่งที่ติดตั้ง Windows ของฉัน วิธีการข้างต้นจะทำงานได้อย่างถูกต้องและถ่ายโอนข้อมูล
ปัญหา : เมื่อฉันพยายามส่งข้อมูลของไดรฟ์ที่แมป (ไดรฟ์เครือข่ายที่ใช้ร่วมกัน) CreateProcess เสร็จสมบูรณ์ แต่ข้อผิดพลาดที่ฉันได้รับคือ rsync ไม่พบไฟล์ คำสั่ง rsync เดียวกัน เมื่อฉันรันบนพรอมต์คำสั่ง ไฟล์ทั้งหมดจะถูกถ่ายโอนได้สำเร็จโดยไม่มีข้อผิดพลาดใด ๆ แต่ล้มเหลวในการถ่ายโอนไฟล์ด้วย CreateProcess
รหัส :
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/
มันเกิดขึ้นเนื่องจากปัญหาด้านความปลอดภัยหรือปัญหาด้านสิทธิ์กับ CreateProcess หรืออย่างอื่นหรือไม่ โปรดช่วยในขณะที่ฉันติดอยู่กับเรื่องนี้
ขอบคุณ
แก้ไข: : สิ่งนี้ทำงานได้ดีตามกระบวนการปกติ แต่เมื่อฉันเรียกใช้ในบริการ มันจะล้มเหลว โดยพื้นฐานแล้วปัญหาในขณะนี้คือบริการไม่สามารถเข้าถึงการแชร์เครือข่าย มีวิธีแก้ไขปัญหาใดบ้าง?
CREATE_NO_WINDOW
อาจเป็นเพียงการพยายามเขียนถึง STDERR หรืออะไรบางอย่าง - person Ben   schedule 13.02.2014