我有一个应用程序,它根据用户请求生成一些中心文件。一旦创建了文件,我想要做的就是将它们放在用户的打印队列中(在这个组织中,有一个中央打印队列,所以用户负责打印他们自己的文档),这样当用户准备好时,它们就可以打印出来了。
通过使用.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属性读取,但它是只读的。如果没有,我是否必须通过模拟来完成,如果是这样,在后一种情况下,我可以做些什么来避免必须存储一堆用户密码,并且每次用户更改密码时软件都会失败?这似乎是一种非常笨拙的操作方式,但由于此活动目前不是以交互方式执行的,我还有什么其他选择呢?
发布于 2012-07-06 06:40:55
我也在做类似的事情。如果进程具有足够的权限来获得所需的模拟级别(例如,模拟或委派与身份验证),则模拟并不是太糟糕。
下面是我用来模拟的方法:
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?
所以我只是写到文件中,尽管我希望避免这种情况。
https://stackoverflow.com/questions/10686983
复制相似问题