Имеется код использующий OpenPrinter, AddJob, ScheduleJob. Все работает нормально с локальным принтером. При попытке открыть удаленный принтер - Code 5. Access Denied. procedure SpoolFile(const FileName, PrinterName: string); var Buffer: record JobInfo: record // ADDJOB_INFO_1 Path: PChar; JobID: DWORD; end; PathBuffer: array[0..255] of Char; end; JobInfo: PJobInfo1; PrinterDefaults: TPrinterDefaults; SizeNeeded: DWORD; Handle: THandle; PrtName: string; begin PrtName := PrinterName; if PrtName = '' then PrtName := Printer.Printers[Printer.PrinterIndex]; // Default printer name PrinterDefaults.pDatatype := 'TEXT'; PrinterDefaults.pDevMode := nil; PrinterDefaults.DesiredAccess := PRINTER_ALL_ACCESS; Win32Check(OpenPrinter(PChar(PrtName), Handle, @PrinterDefaults)); try Win32Check(AddJob(Handle, 1, @Buffer, SizeOf(Buffer), SizeNeeded)); //Finding size GetJob(Handle, Buffer.JobInfo.JobID, 1, nil, 0, @SizeNeeded); GetMem(JobInfo, SizeNeeded); FillMemory(JobInfo, SizeNeeded, 0); try Win32Check(GetJob(Handle, Buffer.JobInfo.JobID, 1, JobInfo, SizeNeeded, @SizeNeeded)); TJobInfo1(JobInfo^).pDocument := PChar(FileName); TJobInfo1(JobInfo^).pDatatype := 'TEXT'; TJobInfo1(JobInfo^).TotalPages := 1000; TJobInfo1(JobInfo^).PagesPrinted := 0; TJobInfo1(JobInfo^).pUserName := 'Vasia Pupkin'; Win32Check(SetJob(Handle, Buffer.JobInfo.JobID, 1, JobInfo, 0)); finally FreeMemory(JobInfo); end; Win32Check(CopyFile(PChar(FileName), Buffer.JobInfo.Path, True); Win32Check(ScheduleJob(Handle, Buffer.JobInfo.JobID) finally Win32Check(ClosePrinter(Handle)); end; end; Валится на OpenPrinter. Что делать? Кстати эта фигня должна выполняться из сервиса. Так что примите полномочия во внимание. Еще вопрос - можно ли как-то управлять Separator Page динамически. Мне нужно писать LPD, но поскольку печать идет из одного процесса, то не понятно как вывести имя пользователя поставившего задание. Буду благодарен за любую информацию!
Сервис у тебя под каким аккаунтом работает? Если под SYSTEM - то он по определению не имеет доступа к сети.