我有两个程序,每个程序都作为单独的帐户运行,即使它们都是管理员帐户。第一个是加密文件的Windows窗体应用程序,另一个是Windows服务。我有一个文件,我使用Windows 8计算机上的标准管理员帐户从Windows窗体程序加密。如果我写一个像c:\ test.xml这样的位置它似乎工作。但是,在安装程序将所有这些安装到目录中的生产中不能使用它。
然后,我尝试在同一目录中读取和解密同一个文件,第二个程序是Windows服务,在另一个名为“Admin”的帐户下运行。问题是,当我尝试Access Denied
时,我收到File.ReadAllText
错误。 AES加密是否使用本地计算机证书存储,因为我想知道是否存在权限问题?
WinForms代码(在标准管理员帐户下运行):
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);
Windows服务代码(在帐户管理员下运行):
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());
string xmlStr = DecryptStringFromBase64String(encryptedText, keyBytes);
我还尝试以管理员身份运行Windows窗体。我尝试将用户“Admin”添加到文件ACL中,但我得到了相同的拒绝访问权限,
答案 0 :(得分:1)
您可能已成为User Account Control Data Redirection的受害者。由于Windows Vista Windows不允许写入某些目录,因此会静默地将任何尝试重定向到每用户虚拟存储。您的应用程序创建的文件可能会在
下的某处结束C:\ Users \< user name> \ AppData \ Local \ VirtualStore
并且Windows服务正在寻找错误的位置,因为它在不同的用户帐户下运行。