Добавление заданий в очередь печати конкретного пользователя

У меня есть приложение, которое выполняет центральную генерацию файлов на основе запросов пользователей. Что я хочу сделать с ним после создания файлов, так это поместить их в очередь печати этого пользователя (в этой организации есть центральная очередь печати, поэтому пользователи несут ответственность за печать своих собственных документов), чтобы затем они могли быть распечатывается, когда пользователь готов.

Используя сборки System.Printing в .net, я могу добавить задание в свою очередь печати, так что я прав в этой части. Мой код печати выглядит так:

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, но он доступен только для чтения. Если нет, должен ли я делать это путем олицетворения, и если да, то в последнем случае могу ли я что-нибудь сделать, чтобы избежать необходимости хранить кучу пользовательских паролей и не вызывать сбой программного обеспечения каждый раз, когда пользователь меняет свой пароль? Похоже, это был бы действительно неуклюжий способ работы, но, поскольку это действие в настоящее время не выполняется в интерактивном режиме, какие еще варианты у меня есть?


person glenatron    schedule 21.05.2012    source источник
comment
Мне было бы интересно услышать ответ на этот вопрос, но пока что я выбрал другой подход, поскольку не смог найти полезный способ спулингации заданий печати на сервере с помощью имеющихся у меня инструментов (включая .net 2.0 , не уверен, что здесь помогло бы System.Printing), поэтому я решил проблему, вместо этого настроив локальное приложение, которое сидело в фоновом режиме, получало документы для печати и распечатывало их с машины пользователя, избегая каких-либо проблем с разрешениями.   -  person glenatron    schedule 25.05.2012
comment
Итак, не хотите ли вы обновить свой вопрос?   -  person Owais Qureshi    schedule 30.05.2012


Ответы (1)


Я делаю нечто подобное. Олицетворение не так уж и плохо, если у процесса есть достаточные разрешения для получения необходимого вам уровня олицетворения (например, олицетворение или делегирование против идентификации).

Вот что я делаю, чтобы выдать себя за другое лицо:

    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;
    }

Примечание. За очистку дескриптора токена отвечает вызывающий метод.

Я разрешаю UPN из запроса LDAP на основе электронной почты пользователя (обычно они одинаковы, но достаточно часто это не так).

Но у меня возникли проблемы с массивом байтов, который я передаю. Я попробовал File.ReadAllBytes, но из-за этого принтер издает тарабарщину. Есть ли какая-то специальная кодировка, которая должна выполняться в GenerateBufferFromFile?

** Обновлять **

Похоже, при непосредственной работе с JobStream возникает множество проблем:

Не работает ли PrintSystemJobInfo.JobStream?

Так что я просто собираюсь писать в файл, хотя надеялся избежать этого.

person doveryai    schedule 05.07.2012