1

次のコードを使用してリモート マシンから証明書ハッシュを取得しようとすると、エラーが発生します。

private string getCertHash(string Hostname)
{
    string result = "";

    using (ServerManager serverManager = ServerManager.OpenRemote(Hostname))
    {
        SiteCollection siteCollection = serverManager.Sites;
        foreach (Site site in siteCollection)
        {
            foreach (Binding binding in site.Bindings)
            {
                if (binding.Protocol == "https")
                {
                    // Error here
                    foreach (Byte certhashbyte in binding.CertificateHash)
                        result += certhashbyte.ToString(); 
                }
            }
        }
    }

    return result;
}

私が受け取るエラーの詳細:

「binding.certhashbyte」が「System.Runtime.InteropServices.COMException」タイプの例外をスローしました

アプリケーションが WSAStartup を呼び出していないか、WSAStartup が失敗しました。(HRESULT からの例外: 0x8007276D)

次の行を置き換えると:

using (ServerManager serverManager = ServerManager.OpenRemote(Hostname))

using (ServerManager serverManager = new ServerManager)

ローカルサーバーを使用するには、正常に動作します。

ServerManager.OpenRemote(Hostname) の使用は一般的に機能することに注意してください (他のすべての情報を取得しますが、CertHash 情報のみがエラーになります。両方のマシン (ローカルとリモート) で管理者権限を持っています。システムは IIS 7.5 を使用する Windows 2008 R2 です) .

私が間違っていること/不足していること/エラーが発生する理由を教えてください。

4

2 に答える 2

2

何らかの理由で、上記のコードは正常に動作するようになりました。うまくいかなかった理由はわかりませんでしたが、共有したい代替手段がいくつか見つかりました。

  1. このコードを使用して、使用例を次に示します。

    CertStoreReader certStoreReader = new CertStoreReader();
    foreach (X509Certificate2 x509 in certStoreReader.GetCertificates(credentials.Hostname))
    {
        certHash = x509.GetCertHashString();
    }
    
  2. 上記で最初に試したようにServerManagerを使用する(質問で)

    using (ServerManager serverManager = ServerManager.OpenRemote(server))
    {
        Site site = serverManager.Sites.Where(s => s.Name == websiteName).Single();
        foreach (Binding binding in site.Bindings)
        {
            certHash += BitConverter.ToString(binding.CertificateHash).Replace("-", string.Empty);      
        }              
    }
    
  3. DirectoryEntry の使用

    DirectoryEntry dir = new DirectoryEntry(@"IIS://" + server + @"/W3SVC/" + siteID);
    PropertyValueCollection vals = dir.Properties["SSLCertHash"];
    foreach (string entry in vals)
    {
        certHash += entry;
    }
    
  4. WMI を使用します。WebAdministration 名前空間で次のクエリを使用しました。

    "SELECT CertificateHash FROM SSLBinding WHERE IPAddress = '" + IP + "' AND Port = " + port
    
于 2012-03-14T09:30:13.320 に答える