这个C#/ XML代码锁定文件/导致拒绝访问另一个进程的内容是什么?

时间:2014-04-10 19:17:37

标签: c# xml encryption aes

这是this SO post的后续版本,我从WinForms应用程序成功对AML实施AES加密,以便从Windows服务解密。这只是因为两个程序都可以使用像c:\ test.xml这样的文件。否则,我从Windows服务中得到了这个可怕的异常:

Unable to load configuration data.  Access to the path 'C:\worl\Project Alpha\Code\AlphaConfigurationUtility\AlphaConfigurationUtility\bin\Debug\alphaService.xml' is denied.

显然硬编码在生产中不起作用,但今天,我同时接受了WinForm和Windows服务项目,并让他们从同一目录中编写和读取。现在我又得到了同样的可怕异常。

编辑:Windows服务可能存在一些权限问题吗?它使用管理员帐户

运行

此代码中的哪些内容可能导致文件被锁定以便从其他程序(Windows服务程序)进行访问?

 try
            {
                string fileName = System.IO.Path.Combine(Application.StartupPath, "alphaService.xml");

                // var fileName = @"c:/text.xml";
                XDocument doc = new XDocument();
                XElement xml = new XElement("Info",
                    new XElement("DatabaseServerName", txtServerName.Text),
                    new XElement("DatabaseUserName", txtDatabaseUserName.Text),
                    new XElement("DatabasePassword", txtDatabasePassword.Text),
                    new XElement("ServiceAccount", txtAccount.Text),
                    new XElement("ServicePassword", txtServicePassword.Text),
                    new XElement("RegistrationCode", txtRegistrationCode.Text));

                doc.Add(xml);

                //using (var aes = Aes.Create())
                //{
                //    aesKey = aes.Key;
                //    key = Convert.ToBase64String(aes.Key);
                //}

                string sKey = "LvtZELDrB394hbSOi3SurLWAvC8adNpZiJmQDJHdfJU=";
                var aesKey = Convert.FromBase64String(sKey);

                string encyptedText = EncryptDecrpt.EncryptStringToBase64String(doc.ToString(), aesKey);
                File.WriteAllText(fileName, encyptedText);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);

            }

解密程序,Windows服务以File.ReadAllText开头并获取异常:

string path = AppDomain.CurrentDomain.BaseDirectory;
            eventLog1.WriteEntry(path);
            string fileName = System.IO.Path.Combine(path, "alphaService.xml");

            // var fileName = @"c:/text.xml";

            string sKey = "LvtZELDrB394hbSOi3SurLWAvC8adNpZiJmQDJHdfJU=";
            Byte[] keyBytes = Convert.FromBase64String(sKey);

            var encryptedText = File.ReadAllText(fileName, new ASCIIEncoding());

1 个答案:

答案 0 :(得分:0)

我看不出哪个语句会导致阻塞,但几天前我遇到了一个非常类似的问题(在一个非常不同的情况下)。一些调用进程阻止了我的文件。我通过使用显式只读流来解决它。我是一个字节流,但对你来说这可能有用:

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (StreamReader rs = new StreamReader(fs))
                {
                    string allText = rs.ReadToEnd();
                }
            }