0

更新 - Python を使用してまったく同じことを試しましたが、完全に機能します!!

import os
os.system('certutil.exe -v -getkey "614D628A00000000014C" C:/Users/kra/kevin')

誰かがこの問題に光を当てることができますか!

このルビーコードを実行すると:

require 'open3'
stdin, stdout, stderr = Open3.popen3('certutil -v -getkey "614D628A00000000014C" C:/Users/kra/kevin')            
puts stdout.read

次のエラーが表示されます。

Querying WIN-3CF41NBPT85.demo.com\demo-CA
CommonName: 614D628A00000000014C
CertUtil: -GetKey command FAILED: 0x80092004 (-2146885628)
CertUtil: Cannot find object or property.

ただし、コマンドラインから直接コマンドを実行すると、機能します。

C:\Users\kra>certutil -getkey "614D628A00000000014C" C:/Users/kra/kevin
Querying WIN-3CF41NBPT85.cjndemo.com\cjndemo-CA.....................

"WIN-3CF41NBPT85.demo.com\demo-CA"
  Serial Number: 614d628a00000000014c
  Subject: CN=Kevin, C=GB
   NotBefore: 11/30/2012 10:20 AM
   NotAfter: 5/7/2013 9:29 AM
  Template: Copy of Web Server
  Version: 3
  Cert Hash(sha1): 88 b1 7a 74 8c be 73 d5 16 07 7f 19 16 57 14 c5 dd a9 79 7f


Recipient Info[0]:
CMSG_KEY_TRANS_RECIPIENT(1)
CERT_ID_ISSUER_SERIAL_NUMBER(1)
    Serial Number: 129e45d3000000000130
    Issuer: CN=demo-CA, DC=demo, DC=com
    Subject: CN=kra, CN=Users, DC=demo, DC=com
CertUtil: -GetKey command completed successfully.

興味深いことに、この Ruby コードを実行すると:-

require 'open3'
stdin, stdout, stderr = Open3.popen3('certutil -recoverkey -p lexicon C:\Users\kra\kevin C:\Users\kra\kevin.pfx')
puts stdout.read

それも機能します。

Computed Hash: 6e d3 b8 ad 93 16 7b f0 fb b3 f5 cd 7e e4 bb ad fb 95 a0 81

User Certificate:
    Serial Number: 614d628a00000000014c
    Issuer: CN=demo-CA, DC=demo, DC=com
    Subject: CN=Kevin, C=GB
    Cert Hash(sha1): 88 b1 7a 74 8c be 73 d5 16 07 7f 19 16 57 14 c5 dd a9 79 7f
CertUtil: -RecoverKey command completed successfully.

明らかにルビーはcertutil.exeコマンドを呼び出すことができるので、ある種の奇妙な環境的なものを想定していますか?

4

1 に答える 1

1

の最初のパラメーターOpen3.popen3は、サブコマンドに渡したい環境です。時々期待どおりに動作させるために、これを使用する必要がありました。

Open3.popen3(ENV, 'command') { ... }

現在のスクリプトの環境をサブコマンドに渡します。現在のスクリプトはコマンドラインから環境を継承しているため、理論的には、サブコマンドにはコマンドラインで発行されたコマンドと同じ情報が含まれます。

必要に応じて、ENV のサブセットを抽出したり、 を呼び出す前に変数を一時的に上書きしたりすることもできますpopen3


の代わりにpopen3、 を使用してみてくださいcapture3。非常に似ていますが、少し低レベルではないと思います。うまく回避さpopen3れた奇妙な動作を見てきました。capture3また、もう一度、 を渡すことができることに注意してくださいENV

于 2012-11-30T21:02:27.290 に答える