2012-05-21 3 views
6

사용자 요청에 따라 일부 중앙 파일 생성을 수행하는 응용 프로그램이 있습니다. 일단 파일이 만들어지면 그 파일로 작업 할 수 있기를 원하는 것은 사용자의 인쇄 대기열 (이 조직에는 중앙 인쇄 대기열이 있으므로 사용자가 자신의 문서를 인쇄 할 책임이 있습니다)에 넣을 수 있기 때문입니다. 사용자가 준비되면 인쇄됩니다.특정 사용자의 PrintQueue에 작업 추가

.net에 System.Printing 어셈블리를 사용하면 자체 인쇄 대기열에 작업을 추가 할 수 있으므로 해당 부분에서 소리가납니다. 내 인쇄 코드는 다음과 같습니다 :

private void RunPrintJob(string myFileName) 
    { 
     PrintServer ps = new PrintServer(@"\\printatron"); 
     PrintQueue queue = new PrintQueue(ps, "psandqueues"); 
     try 
     { 
      PrintSystemJobInfo pj = queue.AddJob(myFileName); 
      Stream myStream = pj.JobStream; 
      Byte[] myByteBuffer = GenerateBufferFromFile(myFileName);    myStream.Write(myByteBuffer, 0, myByteBuffer.Length); 
      myStream.Close(); 
     } 
     catch (Exception ed) 
     { 
      Debug.WriteLine(ed.Message); 
      if (ed.InnerException != null) 
      { 
       Debug.WriteLine(" -> " + ed.InnerException); 
      } 
      result = false; 
     } 
     queue.Commit(); 
    } 

그래서 중앙 집중식으로 작성된 문서를 가지고있어서 어떤 사용자가 작성을 담당했는지 알고 프린터로 보낼 수 있습니다.

내가 지금 필요한 것은 프린터를 사용자로 설정 한 사용자와 함께 프린터로 보낼 수있는 방법입니다. 인쇄 대기열을 통해이를 수행 할 수 있습니까? PrintSystemJobInfo.Submitter 속성에서 읽을 수 있지만 읽기 전용이라는 것을 알고 있습니다. 그렇지 않다면 나는 가장을 통해 그것을해야합니까? 그렇다면 후자의 경우 사용자 비밀번호를 여러 개 저장하지 않아도되고 사용자가 비밀번호를 변경할 때마다 소프트웨어가 실패하는 것을 피할 수있는 방법이 있습니까? 이것은 실제로 작동이 어색한 것처럼 보입니다. 그러나이 활동은 현재 대화 형으로 수행되지 않으므로 다른 옵션은 있습니까?

+0

나는 이것에 대한 대답을 듣고 싶다. 그러나, 내가 사용할 수있는 도구로 서버의 인쇄 작업을 스풀링하는 유용한 방법을 찾지 못해 결국 다른 접근법을 취했다. .net 2.0, 확실하지 System.Printing 물건이 여기에 도움이되었을 경우) 대신 배경에 앉아있는 로컬 응용 프로그램을 설정하여 문제를 해결하고 인쇄용 워드 프로세서를 검색하여 사용자의 컴퓨터에서 인쇄하여 사용 권한을 피하는 방법 문제. – glenatron

+0

그럼 질문을 업데이트 하시겠습니까? –

답변

3

나는 비슷한 것을하고 있습니다. 프로세스에 필요한 가장 수준 (예 : 명의 또는 위임 또는 ID)을 얻을 수있는 충분한 권한이있는 경우 가장도 나쁘지 않습니다.

public static bool GetImpersonationToken(string UPN, out IntPtr dupToken) 
    { 
     dupToken = IntPtr.Zero; 
     WindowsImpersonationContext impersonationContext = null; 

     bool result = false; 
     try 
     { 
      WindowsIdentity wid = new WindowsIdentity(UPN); 
      impersonationContext = wid.Impersonate(); 
      result = DuplicateToken(wid.Token, 2, ref dupToken) != 0; 
     } 
     finally 
     { 
      if (impersonationContext != null) 
       impersonationContext.Undo(); 
     } 

     return result; 
    } 

참고 : 여기에

내가 가장 할 할 것입니다 토큰 핸들 것을 정리하기 위해 호출하는 메소드의 책임입니다.

나는 사용자의 이메일을 기반으로 LDAP 쿼리에서 UPN을 해결합니다 (일반적으로 같지만 자주 그렇지 않습니다).

하지만 전달해야 할 바이트 배열에 문제가 있습니다. File.ReadAllBytes를 시도했지만 프린터에서 횡설수설이 발생합니다. GenerateBufferFromFile에서 발생해야하는 특수 인코딩이 있습니까?

** 업데이트 ** 직접 작업 열 작업 주위에 문제의 무리가있는 것처럼

가 보이는 :

Is PrintSystemJobInfo.JobStream broken?

그래서 난 그냥 파일에 쓸거야, 나는 비록 그것을 피하기를 희망했다.