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上开发的。 请让我知道可能出了什么问题。

File.Encrypt() 导致 IOException 参数不正确

这是一个可能适合您的解决方案:

如果您能够使用命令提示符(批处理脚本[.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身份正确登录后启动用户证书和密钥程序的原因。

C# 脚本

(确保将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 年后,您将拥有自己的手段。希望这对像我或你这样一路上遇到这个问题的人有所帮助:)。