在远程计算机上使用 Invoke-Command 启动的进程无法加载 X509 证书

问题描述

请耐心等待,因为我在基于 Windows Server 2012 的自定义 AWS EC2 AMI 中进行了一些棘手的设置。

我使用 CloudFormation 编排了一台机器。一旦机器启动并通过配置脚本的 UserData 部分进行配置,我需要在机器上启动一个守护进程。我在远程机器上使用 PowerShell:

Invoke-Command \
    -ComputerName '<IP>' \
    -Credential $cred \
    -ScriptBlock { \
        $res = C:\bootstrap.ps1 C:\daemonlauncher.ps1;
        Start-Sleep -Seconds 5;
        return $res;
    };

bootstrap.ps1内容是:

Invoke-WmiMethod -Class "Win32_Process" -Name "Create" -ArgumentList "powershell -File $($args[0])";

daemonlauncher.ps1内容很简单:

# Some PATH environment setup...
start-process -FilePath daemon.exe -ArgumentList 8080;

这样,我最终在端口 8080 上运行了一个 daemon.exe 实例。目前,发生的情况是:

  1. Invoke-Command 在远程机器 bootstrap.ps1 中执行。
  2. bootstrap.ps1 创建一个新的 PowerShell 实例,并将 daemonlauncher.ps1 传递给它。
  3. daemonlauncher.ps1 启动 daemon.exe 进程并退出。守护进程仍在运行。

现在,棘手的部分daemon.exe 用于启动第二个进程,我们称之为 server.exe。现在,server.exe 使用自签名证书侦听 SSL 端口。但是,它无法加载自签名证书,尽管它能够创建它。 server.exe 是用 C# 编写的,它抛出的错误是(检查访问被拒绝部分):

Error importing certificate 'c:\server\ssl-certificate.pfx': Access denied

但是,如果不是使用远程计算机上的 Invoke-Command 来执行 bootstrap.ps1(步骤 1),而是直接从目标计算机中执行此操作,server.exe 进程可以加载证书完全没有问题。

C:\bootstrap.ps1 C:\daemonlauncher.ps1

使用 ProcessExplorer 检查 daemon.exe 的安全选项卡,我可以看到权限不同,具体取决于我启动它的方式:

  • 使用 Invoke-Command 从远程机器启动:
    • 所有权限均为 Enabled
  • 从目标机器手动启动 bootstrap.ps1
    • 所有权限均为 disabled,除了:
      • SeChangeNotifyPrivilege > 认启用
      • SeCreateGlobalPrivilege > 认启用
      • SeDebugPrivilege > 已启用
      • SeImpersonatePrivilege > 认启用

在这里不知所措。任何帮助将不胜感激。


更多信息

在使用 Process Explorer / Process Monitor 之后,我可以获得此附加信息:

当从远程机器(使用 Invoke-Command)启动时,daemon.exe 在安全选项卡下具有正确的用户 ({MACHINE-NAME}\Administrator) 和正确的 SID

检查进程监视器,我可以看到 server.exe 尝试访问 %APPDATA%\Microsoft\Crypto\RSA\{SID},但它没有尝试在其中创建任何文件(我认为 ed0352f... 上的 CREATE FILE NAME NOT FOUND 结果只是试图读取它的过程)。

12:01:42.0687133 PM server.exe  1228    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto NAME COLLISION  Desired Access: Read Data/List Directory,Synchronize,disposition: Create,Options: Directory,Synchronous IO Non-Alert,Attributes: S,ShareMode: Read,Write,AllocationSize: 0
12:01:42.0687908 PM server.exe  1228    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA NAME COLLISION  Desired Access: Read Data/List Directory,AllocationSize: 0
12:01:42.0689283 PM server.exe  1228    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500    NAME COLLISION  Desired Access: Read Data/List Directory,AllocationSize: 0
12:01:42.0691444 PM server.exe  1228    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500\ed0352ff16ca244170b661836cbecde9_63d47ad1-1696-4af6-bfda-1963bc1d25d0  NAME NOT FOUND  Desired Access: Generic Read,disposition: Open,Options: Sequential Access,Non-Directory File,Attributes: n/a,AllocationSize: n/a
12:01:42.0692365 PM server.exe  1228    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500    SUCCESS Desired Access: Read Data/List Directory,Delete,AllocationSize: n/a,OpenResult: Opened
12:01:42.0692590 PM server.exe  1228    QueryDirectory  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500\ed0352ff16ca244170b661836cbecde9_* NO SUCH FILE    Filter: ed0352ff16ca244170b661836cbecde9_*
12:01:42.0692752 PM server.exe  1228    CloseFile   C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500    SUCCESS 

当我从远程计算机执行以下行时,我发现 Administrator 用户配置文件已加载(属性 LoadedTrue)。值得注意的是,我正在运行的所有内容都使用 -Credential for Administrator

Invoke-Command \
    -ComputerName '<IP>' \
    -Credential $cred` \
    -ScriptBlock {
        Get-WmiObject -Class "Win32_UserProfile";
    };

然后,一旦我从目标机器至少运行一次 daemon.exe(直接在目标机器上从上面运行第 2 步),server.exe DOES CREATE %APPDATA%\Microsoft\Crypto\RSA\{SID} 下的文件并写入其中(在本例中为 9a470a...):

12:06:39.3433354 PM server.exe  3420    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto NAME COLLISION  Desired Access: Read Data/List Directory,Open For Backup,AllocationSize: 0
12:06:39.3434039 PM server.exe  3420    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA NAME COLLISION  Desired Access: Read Data/List Directory,AllocationSize: 0
12:06:39.3434697 PM server.exe  3420    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500    NAME COLLISION  Desired Access: Read Data/List Directory,AllocationSize: 0
12:06:39.3435435 PM server.exe  3420    CreateFile  C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500\9a470a37b16b84cf43ed29a419dfbb0b_63d47ad1-1696-4af6-bfda-1963bc1d25d0  SUCCESS Desired Access: Generic Write,Read Attributes,disposition: OpenIf,ShareMode: None,AllocationSize: 0,OpenResult: Created
12:06:39.3436466 PM server.exe  3420    WriteFile   C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500\9a470a37b16b84cf43ed29a419dfbb0b_63d47ad1-1696-4af6-bfda-1963bc1d25d0  SUCCESS Offset: 0,Length: 79,Priority: normal
12:06:39.3436929 PM server.exe  3420    CloseFile   C:\Users\Administrator\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-928426534-1735938674-1186316988-500\9a470a37b16b84cf43ed29a419dfbb0b_63d47ad1-1696-4af6-bfda-1963bc1d25d0  SUCCESS 

一旦我在本地运行了一次程序,如果我从远程计算机开始执行所有操作server.exe 可以正确加载证书直到机器重新启动。然后我们又回到了问题的开头。

每次在 ...\Crypto\RSA\S-1-5-21...\ 下创建一个不同的文件

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)