这是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());
答案 0 :(得分:0)
我看不出哪个语句会导致阻塞,但几天前我遇到了一个非常类似的问题(在一个非常不同的情况下)。一些调用进程阻止了我的文件。我通过使用显式只读流来解决它。我是一个字节流,但对你来说这可能有用:
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader rs = new StreamReader(fs))
{
string allText = rs.ReadToEnd();
}
}