首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将作业添加到特定用户的PrintQueue

将作业添加到特定用户的PrintQueue
EN

Stack Overflow用户
提问于 2012-05-21 22:16:32
回答 1查看 4.2K关注 0票数 7

我有一个应用程序,它根据用户请求生成一些中心文件。一旦创建了文件,我想要做的就是将它们放在用户的打印队列中(在这个组织中,有一个中央打印队列,所以用户负责打印他们自己的文档),这样当用户准备好时,它们就可以打印出来了。

通过使用.net中的System.Printing程序集,我能够将作业添加到我自己的打印队列中,因此我在这方面是可靠的。我的打印代码如下所示:

代码语言:javascript
复制
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属性读取,但它是只读的。如果没有,我是否必须通过模拟来完成,如果是这样,在后一种情况下,我可以做些什么来避免必须存储一堆用户密码,并且每次用户更改密码时软件都会失败?这似乎是一种非常笨拙的操作方式,但由于此活动目前不是以交互方式执行的,我还有什么其他选择呢?

EN

回答 1

Stack Overflow用户

发布于 2012-07-06 06:40:55

我也在做类似的事情。如果进程具有足够的权限来获得所需的模拟级别(例如,模拟或委派与身份验证),则模拟并不是太糟糕。

下面是我用来模拟的方法:

代码语言:javascript
复制
    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有一堆问题:

Is PrintSystemJobInfo.JobStream broken?

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10686983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档