2009-04-20 147 views
7

我們目前正在將我們的網站從Windows 2003(32位)轉移到Windows 2008(64位),並出現問題。32位dll 64位操作系統與regsvr32.exe

我們的一個網站使用的支付網關匯豐CPI及須予註冊的DLL(regsvr32.exe的),這個DLL,然後一個經典的ASP網站內部使用。問題是DLL是一個32位的DLL,因此它不會註冊到Windows 2008操作系統。

會有如此,它的方法是暴露的,我們可以換一個C#.NET項目這32位DLL,可以與操作系統進行registerd的方法嗎?

任何幫助將非常感激。

回答

5

你可以註冊與C的regsvr32.exe的DLL:\ WINDOWS \ SysWOW64中的文件夾。

但是,由於無法混合使用64/32位代碼,因此您必須創建一個在x86中運行的C#服務(請參閱項目屬性,平臺目標),然後您可以通過WCF從x64 Web應用程序使用該服務。

一個更簡單的選擇是向匯豐申請一個x64 dll。

+0

感謝克里斯這個作品。 不幸的是匯豐不支持64位操作系統。 – 2009-04-20 14:25:51

2

我們遇到了與HSBC Cpi接口相同的問題。

匯豐銀行不提供.NET包裝,和COM包裝 不能從64位應用程序調用。

這使得從64服務器(這可能 佔地面積新的生產服務器25%)幾乎IMPOSIBLE上部署它。

我們看了一些上市的途徑,但他們似乎 了很多工作。最後經過一番討論後,我們 想出了我們自己的實現,這看起來像 這個。

使用下面的Java代碼來獲取中間值散列

import java.io.Console; 
import java.lang.*; 
import java.util.*; 
import com.clearcommerce.CpiTools.security.HashGenerator; 
import com.clearcommerce.CpiTools.security.SecCrypto; 
import javax.xml.bind.annotation.adapters.HexBinaryAdapter; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Vector; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

public class Extract { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try 
     { 
      String encryptedKey = "<YOUR SECRET KEY HERE>"; 
      if (args.length == 1) 
       encryptedKey = args[0]; 

      HexBinaryAdapter hb = new HexBinaryAdapter(); 
      SecCrypto sc = new SecCrypto(); 

      byte abyte0[] = sc.decryptToBinary(encryptedKey); 
      System.out.println("New Secret Base64 Encoded : " + new String(Base64Coder.encode(abyte0))); 
      System.out.println("New Secret Hex Encoded : " + hb.marshal(abyte0)); 
      return; 
     } 
     catch(Exception ex) 
     { 
      System.out.println("Error:" + ex.getMessage()); 
     } 
    } 
} 

然後使用下面的.NET代碼calcualte哈希

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace HsbcIntergration 
{ 
    internal static class CpiHashing 
    { 
     <USE THE VALUE RETURNED FROM THE JAVA CODE HERE> 
     private static readonly byte[] _secret = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

     public static string ComputeHash(List<string> inputList) 
     { 
      return ComputeHash(inputList, _secret); 
     } 

     public static string ComputeHash(List<string> inputList, byte[] secretData) 
     { 
      List<string> orderedDataToHash = new List<string>(inputList); 
      orderedDataToHash.Sort(StringComparer.Ordinal); 

      StringBuilder sb = new StringBuilder(); 
      foreach (string s in orderedDataToHash) 
       sb.Append(s); 

      List<byte> dataToHash = new List<byte>(); 
      dataToHash.AddRange(Encoding.ASCII.GetBytes(sb.ToString())); 
      dataToHash.AddRange(secretData); 

      System.Security.Cryptography.HMAC sha = System.Security.Cryptography.HMACSHA1.Create(); 
      sha.Key = secretData; 
      return Convert.ToBase64String(sha.ComputeHash(dataToHash.ToArray(), 0, dataToHash.Count)); 
     } 
    } 
} 
5

如果您要註冊的32位COM DLL使用VC++或Visual Basic 6.0創建,那麼您必須按照以下步驟進行操作,而不對代碼進行任何更改。它也不需要進行任何編譯,也不需要在WOW模式下運行IIS。幾年前我遇到過這個問題,我解決了這個問題,它對我來說工作正常。

場景:

讓我假設你有一個供應商提供的第三方32位COM DLL。該DLL在32位操作系統上正常工作,並且即使您嘗試通過regsv32註冊,它仍然無法正常工作。

另外讓我假設該DLL的名稱是「ASXUpload.DLL」。我將在下面提供的解決方案中使用該名稱。

解決方案

請按照下列步驟操作:

  1. 首先,如果你已經註冊的DLL在64位操作系統的註銷DLL。要做到這一點,只需在運行命令「regsvr32/u」,如「regsvr32/u C:\ MyDLL \ ASXUpload.DLL」中鍵入以下內容即可。如果您已經從x64操作系統註銷了DLL,則無需運行此步驟。

  2. 此外請確保您沒有將DLL保存在通常爲C:\ Windows的Windows文件夾中。對於這個例子,我將DLL保存在以下文件夾C:\ MyDLL中。

  3. 現在我們需要使用Microsoft的組件服務添加COM +組件。要啓動組件服務,請轉到控制面板/管理工具/組件服務。進入組件服務之後,深入到計算機,然後深入我的電腦,然後深入COM +應用程序。然後右鍵單擊COM +應用程序並選擇「新建」 - >「應用程序」。

  4. 在「歡迎使用COM應用程序安裝嚮導」屏幕上,單擊「下一步>」。

  5. 點擊「創建空應用程序」按鈕。

  6. 輸入名稱。由於我的DLL名稱是ASXUpload.dll,所以我輸入名稱爲「ASXUpload」。當被問及「庫或服務器」時,選擇「服務器」。

  7. 點擊「下一步>」按鈕,然後選擇「此用戶」。

  8. 輸入用戶或單擊瀏覽以選擇用戶。單擊瀏覽更安全,以確保使用正確的域名和拼寫。輸入密碼並確認密碼。警告,如果需要,請務必包含域名/用戶名。點擊「完成」。 (注意:我們推薦「此用戶」,否則,必須有人登錄到服務器才能運行DLL)。在我的情況下,我選擇了域管理員帳戶。您還可以添加一個服務帳戶。如果您不確定,請諮詢您的系統管理員。

  9. 現在會出現「添加應用程序角色」屏幕。不要添加任何東西只需點擊「下一步>」按鈕。

  10. 現在出現「添加用戶到角色」屏幕。不要添加任何東西只需點擊「下一步>」按鈕。

  11. 現在您將看到,在組件服務 - >計算機 - >我的電腦 - > COM +應用程序 - >您將看到新添加的應用程序。在這個例子中,應用程序名稱是「ASXUpload」。現在通過點擊「+」圖標鑽取新添加的應用程序「ASXUpload」,您將看到「組件」。

  12. 現在右鍵單擊「Components」,然後選擇「New Component」。在「歡迎使用COM應用程序安裝嚮導」屏幕上,單擊「下一步>」。

  13. 點擊「安裝新組件」,現在選擇你想註冊的DLL。如果是「C:\ MyDLL \ ASXUpload.DLL」。

  14. 一旦你選擇了DLL,你會看到它會顯示你找到的組件。點擊「下一步>」按鈕繼續,最後點擊「完成」按鈕完成。

  15. 現在是棘手的部分。右鍵單擊您添加的應用程序,您將在組件服務 - >計算機 - >我的電腦 - > COM +應用程序下找到它。在我的情況下,應用程序名稱是「ASXUpload」。右鍵單擊應用程序後,選擇「屬性」。應用程序屬性窗口將打開。點擊「安全」標籤。在安全選項卡中,確保在「授權」部分下的複選框「強制對此應用程序進行訪問檢查」未選中。

在「安全級別」部分下,選擇單選按鈕「僅在進程級別執行訪問檢查。安全屬性不會包含在對象上下文中。 COM +安全呼叫上下文將不可用。「

確保未選中」應用限制策略「選項。

設置「模擬級別」爲「無名氏」

如果您要訪問的Web應用程序的DLL然後確保你添加IUSR和IWAM賬號
  • 。爲此,請轉至COM +應用程序 - >應用程序名稱(在這種情況下,它將爲ASXUpload) - >角色 - > CreateOwner - >用戶。右鍵單擊用戶並添加Internet信息服務器使用的IUSR和IWAM帳戶。

  • 還在保留該DLL的文件夾上設置NTFS權限。在這種情況下,我將該DLL保存在文件夾C:\ MyDLL中。現在右鍵單擊文件夾「MyDLL」並轉到安全選項卡,然後添加IUSR和IWAM帳戶。

  • 這就是你需要做的,你應該能夠使用DLL。

    我在過去曾在生產環境中工作過的兩個不同組織中使用了這種技術兩次,並且它沒有任何問題。首先我在2005年嘗試了這一點,然後在2008年再次使用它。

    讓我知道你是否面臨任何問題。

    相關問題