从 C#/.NET 将密码输入命令行可执行文件
Entering a password into a command-line executable from C#/.NET
我正在尝试围绕 1Password CLI tool 构建一个 .NET 包装器,以便从我们的内部工具中管理我们的保险库,但是我似乎无法发送输入。它似乎没有使用通常的标准输入来输入密码。有没有办法启动进程并向其发送击键而不是使用标准输入?
以下不工作,可执行文件不接收输入:
ProcessStartInfo processStartinfo = new ProcessStartInfo(_opPath, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
Process process = Process.Start(processStartinfo);
process.StandardInput.WriteLine("password");
process.StandardInput.Flush();
也许尝试将 StandardInputEncoding 设置为 System.Text.ASCIIEncoding(或其他编码),然后看看它是否有效?
PostThreadMessage
如果一切都失败了,也许这对你有用。考虑使用 PostThreadMessage 函数进行调查。密码应用程序肯定会有一个消息队列,您可以将消息发送到。
获得 threadId (Process.Threads) 后,将 WM_Char 消息发送到密码进程并查看它是否处理它们。
public const Int32 WM_CHAR = 0x0102;
public const Int32 WM_KEYDOWN = 0x0100;
public const Int32 WM_KEYUP = 0x0101;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostThreadMessage(uint threadId, uint msg, IntPtr wParam, IntPtr lParam);
事实证明这与 Dour 提到的一致,需要注意的是顺序非常具体(至少在我的情况下)。写入 StandardInput,然后读取 StandardOutput,然后读取 StandardError。任何其他顺序都会导致死锁。
我正在尝试围绕 1Password CLI tool 构建一个 .NET 包装器,以便从我们的内部工具中管理我们的保险库,但是我似乎无法发送输入。它似乎没有使用通常的标准输入来输入密码。有没有办法启动进程并向其发送击键而不是使用标准输入?
以下不工作,可执行文件不接收输入:
ProcessStartInfo processStartinfo = new ProcessStartInfo(_opPath, arguments)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
Process process = Process.Start(processStartinfo);
process.StandardInput.WriteLine("password");
process.StandardInput.Flush();
也许尝试将 StandardInputEncoding 设置为 System.Text.ASCIIEncoding(或其他编码),然后看看它是否有效?
PostThreadMessage
如果一切都失败了,也许这对你有用。考虑使用 PostThreadMessage 函数进行调查。密码应用程序肯定会有一个消息队列,您可以将消息发送到。
获得 threadId (Process.Threads) 后,将 WM_Char 消息发送到密码进程并查看它是否处理它们。
public const Int32 WM_CHAR = 0x0102;
public const Int32 WM_KEYDOWN = 0x0100;
public const Int32 WM_KEYUP = 0x0101;
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostThreadMessage(uint threadId, uint msg, IntPtr wParam, IntPtr lParam);
事实证明这与 Dour 提到的一致,需要注意的是顺序非常具体(至少在我的情况下)。写入 StandardInput,然后读取 StandardOutput,然后读取 StandardError。任何其他顺序都会导致死锁。