7

我有一个应用程序可以根据用户请求生成一些中央文件。创建文件后,我希望能够将它们放入该用户的打印队列中(在该组织中,有一个中央打印队列,因此用户负责打印自己的文档),以便它们可以当用户准备好时打印出来。

通过使用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属性中读取,但那是只读的。如果不是,我是否必须通过模拟来做到这一点,如果是的话,在后一种情况下,我能做些什么来避免必须存储一堆用户密码并且每次用户更改密码时软件都会失败?这似乎是一种非常笨拙的操作方式,但是由于此活动当前不是交互式执行的,我还有哪些其他选择?

4

1 回答 1

3

我正在做类似的事情。如果进程有足够的权限来获得您需要的模拟级别(例如模拟或授权与识别),模拟也不会太糟糕。

这是我模仿的方法:

    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 中是否需要进行一些特殊编码?

** 更新 **

看起来直接使用 JobStream 有很多问题:

PrintSystemJobInfo.JobStream 是否损坏?

所以我只是要写文件,尽管我希望避免这种情况。

于 2012-07-05T22:40:55.320 回答