File.Encrypt() 导致 IOException 参数不正确
本文关键字:IOException 参数 不正确 导致 Encrypt File | 更新日期: 2023-09-27 18:33:22
我有一个Web应用程序,当出现提示时,它将检查特定位置是否有带有一些加密密钥的文件。 如果文件不存在,密钥将自动生成并存储在文件中。 之后,文件应该被加密。
当我跑步时
File.Encrypt(keyFilePath);
它遇到一个IOException
,消息正在"The parameter is incorrect"
。
操作在模拟受限帐户的情况下运行。 当我在自己提升的凭据下运行时,一切都很完美。 我已经检查了证书,为受限帐户创建了一个证书,将该帐户添加到所有可能的角色(加密操作员等(并进行了测试。 什么都没用。 在测试环境中,我将帐户提升到不合理的级别,它可以执行加密操作。 之后,我将帐户设置回通常的水平,它可以完美地读取文件。
问题是,一旦此解决方案最终确定,我就不能要求在生产中执行该操作。 我的测试环境是Windows Server 2008数据中心版,该解决方案是在asp .net mvc 5上开发的。 请让我知道可能出了什么问题。
这是一个可能适合您的解决方案:
如果您能够使用命令提示符(批处理脚本[.bat](,或者您已经用任何允许您运行外部exe的语言编写了应用程序,则答案就在PSExec.exe并且您不需要管理员权限。
我不是Microsoft的 EFS 如何编码或工作的专家,但问题似乎与每个用户在后台运行的证书或密钥管理程序有关,仅在用户登录时。我说程序是因为没有通过登录到PC上的其他用户(用户X(来启动任何服务(除了已经运行的服务(。
PSExec能够完全在后台执行用户的正确登录,而"以用户身份运行"(或类似内容(似乎模仿用户的安全令牌(再次,我不是Windows员工(与LogonUser功能类似。
无论如何,这是一劳永逸地解决问题的代码(请记住,用户X是首先加密文件的用户(:
批处理脚本:
cd /d "C:/PSExec/directory"
PSExec -accepteula -nobanner -d -u "User X" -p "P455W0RD" cipher /c "C:/path/to/any.file"
运行批处理文件后,代表用户 X 运行应用。您可以使用Windows的内置任务计划程序使批处理文件在启动时启动。
上面发生了什么:
转到 PSExec 目录
使用以下选项运行 PSExec:
(-accepteula( 否则,PSExec 会要求您单击软件许可协议的"同意">
图标(-nobanner( 不要显示 PSExec 版权和作者横幅
(-d( 不启动交互式命令提示符
(-u & -p( 最初加密您要运行的应用程序的用户的用户名和密码,他们也必须是您要为其运行应用程序的用户(如您所说,用户 X(
(密码/c [文件路径]( 使用 EFS 代表用户 X 检查文件;这就是在PSExec以用户X身份正确登录后启动用户证书和密钥程序的原因。
(确保将using System.Diagnostics;
放在 C# 脚本文件的顶部(:
//Register a process context for PSExec to initialize a real user logon & relevant EFS programs
ProcessStartInfo execution = new ProcessStartInfo
{
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true,
RedirectStandardInput = true,
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
FileName = "C:/path/to/PSExec.exe",
Arguments = "-accepteula -nobanner -d -u '"User X'" -p '"P455W0RD'" cipher /c '"C:/path/to/any.file'""
};
//Run user & EFS initialization
Process.Start(execution).WaitForExit();
//Initialize execution of an encrypted program on behalf of a user
execution.FileName = "C:/path/to/encrypted/app.exe";
execution.UserName = "User X";
execution.PasswordInClearText = "P455W0RD";
//Run the specified user's exclusive application
Process.Start(execution);
//Terminate thread
return;
就您的密码而言,这不是最安全的,但我相信在这篇文章发布 7 年后,您将拥有自己的手段。希望这对像我或你这样一路上遇到这个问题的人有所帮助:)。