7

ユーザーの要求に基づいて中央ファイルを生成するアプリケーションがあります。ファイルが作成されたら、それでできるようにしたいのは、それらをそのユーザーの印刷キューに配置することです(この組織には中央の印刷キューがあるため、ユーザーは自分のドキュメントを印刷する責任があります)。ユーザーの準備ができたら印刷されます。

.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ますが、それは読み取り専用です。そうでない場合は、なりすましによってそれを行う必要がありますか?もしそうなら、後者の場合、多数のユーザーパスワードを保存し、ユーザーがパスワードを変更するたびにソフトウェアが失敗するのを避けるためにできることはありますか? それは非常に不器用な操作方法のように思えますが、このアクティビティは現在インタラクティブに実行されていないため、他にどのようなオプションがありますか?

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 に答える