如何解决在远程计算机上使用 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
实例。目前,发生的情况是:
-
Invoke-Command
在远程机器bootstrap.ps1
中执行。 -
bootstrap.ps1
创建一个新的 PowerShell 实例,并将daemonlauncher.ps1
传递给它。 -
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
:
我在这里不知所措。任何帮助将不胜感激。
更多信息
在使用 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
用户配置文件已加载(属性 Loaded
为 True
)。值得注意的是,我正在运行的所有内容都使用 -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 举报,一经查实,本站将立刻删除。