保存された資格情報を使用できる特定のWindowsアプリケーションを自動化するために、Windowsの保存された資格情報を管理するためのAPI呼び出しをadvapi32.dll
に呼び出して動作します。COMのマーシャリングされていないアンマネージのUnicode文字列SecureStringのメモリ
いつでもパスワードに含まれるテキストとやりとりする必要がないので、SecureString
をパスワードに使用するようにコードを更新しようとしています。そのため、アプリケーションでパスワードがプレーンテキスト。
私はAPI呼び出しに渡すCOMタスクアロケータメモリにSecureStringをマーシャリングすることができています:それは戻ってアプリケーションにその情報を読み取るに来るとき、私は方法を見つけることができない、しかし
var unmanagedPassword = Marshal.SecureStringToCoTaskMemUnicode(userCredential.Password);
そのような管理されていない文字列をSecureString
にマーシャリングするには、文字列またはバイト配列として管理されたメモリに文字列をコピーしないでください。
これを行うための安全な方法はありますか?見落としていますか?
この質問が「どうしてうまくいかないの?私は方法を見つけることができない何かをする方法を尋ねています。私は私が必要なものを明確に指定したと思う。アンマネージメモリから新しいSecureStringを作成する。 – Ashigore
これは興味深い見落としです。私は、最も単純な方法(アンマネージコードなし)は、Marshal.ReadInt16()のループで '.AppendChar()'を呼び出すことです(Unicode文字列を前提としています)。 'char *'と長さをとる安全でないコンストラクタもあります。管理されていないメモリはゼロにして割り当てを解除する必要があります。そうでなければ、すべてのデータがプレーンテキストで浮動している間に 'SecureString'を使用することはあまり意味がありません。 –
ありがとう@JeroenMostert、そのトリックでした! – Ashigore