将文件写为一个用户,另一个用户访问失败

时间:2014-04-11 14:24:26

标签: c# xml encryption aes

我有两个程序,每个程序都作为单独的帐户运行,即使它们都是管理员帐户。第一个是加密文件的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中,但我得到了相同的拒绝访问权限,

1 个答案:

答案 0 :(得分:1)

您可能已成为User Account Control Data Redirection的受害者。由于Windows Vista Windows不允许写入某些目录,因此会静默地将任何尝试重定向到每用户虚拟存储。您的应用程序创建的文件可能会在

下的某处结束
  

C:\ Users \< user name> \ AppData \ Local \ VirtualStore

并且Windows服务正在寻找错误的位置,因为它在不同的用户帐户下运行。