在C#中编写或复制文件到网络共享

时间:2017-06-07 20:53:29

标签: c# file networking printing io

我写了一个Windows服务,冒充会话0来访问本地打印机并将汇票打印到网络点阵打印机。该部分工作得很好,并且想法是客户端终端(运行3.5桌面应用程序)将生成一个xml文件,该文件被写入(或复制,我不关心)该机器上的共享,并且打印队列服务将每隔几秒钟选择一次,按编号和存储顺序排序,然后将作业发送到正确的商店打印机。一切正常。

但是我们的问题是,我们无法在不先在每台计算机上保存凭据的情况下将xml文件保存到远程共享。尽管与每个人都有共享的读/写/修改权限共享它,但它不会工作。显然,客户不愿意为300多台计算机输入用户名和密码。

我已经尝试了我能想到的一切。我已经尝试使用WindowsIdentity和WindowsImpersonationContext进行模拟,但我总是得到#34;提供的名称不是正确形成的帐户名。"无论我使用name @ domain还是domain \ name,或者应用程序退出而事件查看器或我们的数据库中都没有记录错误消息。我尝试使用找到的here代码成功映射了驱动器,但我拒绝访问它。我已尝试使用替代代码来使用Windows API中的LogonUser(不起作用)。我已经共享并重新共享了我可以找到的限制最少的权限的文件夹。什么都行不通。

关于我们现在可以做些什么的任何建议?代码在这里:

 foreach (MoneyOrderPrinterLineItem item in this.Lines)
        {
            string path = Globals.MoneyOrderPrintJobsPath + Globals.Store.StoreNameID.ToString("0#") +
                (Globals.DrawerContext.GetActiveDrawer()?.DrawerNameOnly) + Security.UserName + item.Number +
                DateTime.Now.ToString("MMddyyyy") + DateTime.Now.ToString("hhmmss") + ".xml";

            try
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = ASCIIEncoding.Unicode;


                //create a new file for each money order
                using (FileStream stream = new FileStream(path, FileMode.CreateNew))
                {
                    using (XmlWriter writer = XmlWriter.Create(stream, settings))
                    {
                        writer.WriteStartDocument();
                        writer.WriteStartElement("PrintJob");

                        writer.WriteStartElement("Source");
                        writer.WriteElementString("Name", Security.UserName);
                        writer.WriteElementString("Store", Globals.Store.StoreNameID.ToString("0#"));
                        writer.WriteElementString("StoreID", Globals.Store.ID.ToString());
                        writer.WriteElementString("Drawer", Globals.DrawerContext.GetActiveDrawer()?.DrawerNameOnly);
                        writer.WriteElementString("DateTime", DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString());
                        writer.WriteElementString("Machine", Environment.MachineName);
                        writer.WriteElementString("PrinterName", Globals.Store.MoneyOrderPrinter);
                        writer.WriteEndElement();

                        writer.WriteStartElement("Details");
                        writer.WriteElementString("Number", item.Number);
                        writer.WriteElementString("Payee", item.Payee);
                        writer.WriteElementString("Remitter", item.Remitter);
                        writer.WriteElementString("AmountDesc", item.AmountText);
                        writer.WriteElementString("Amount", item.Amount.ToString("F2"));
                        writer.WriteElementString("Fee", item.Fee.ToString("F2"));
                        writer.WriteElementString("BusinessDate", item.Date);
                        writer.WriteElementString("Notes", item.StoreNotes);
                        writer.WriteEndElement();

                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                        writer.Close();
                    }
                }
            }
            catch (IOException ioEX)
            {
                Methods.ProcessException(ioEX, true);
            }
            catch (Exception ex)
            {
                Methods.ProcessException(ex, true);
            }
        }

所有计算机都在同一个域中。全球汇票路径为\\WEB2012R2-DEV\MOPrints

1 个答案:

答案 0 :(得分:0)

使用我们的网络服务保存本地文件的建议非常精彩。谢谢大家!