2012년 2월 20일 월요일

[ArcObjects]ArcSDE Connection 정보 저장…

>> ArcObjects로 프로젝트를 진행하던 도중.. FeatureClass나 Table의 정보를 저장하였다가 불러와서 사용해야 하는 기능이 있었다. 로컬 ShapeFile이나 Personal GDB, File GDB의 경우에는 파일의 Path를 저장하여 나중에 해당 Path로 WorkSpace를 잡아주면 되는데… 문제는 SDE상에 올라가 있는 DataSet이다.
>> SDE에 올라가있는 데이터의 경우에 필요한 것이 서버정보(IP), 인스턴스(esri_sde), USER, PASSWORD 인데.. 다른건 모두 저장하면 되는데.. 문제는.. PassWord 였다.. 사용자에게 입력받기도 그렇고.. 그렇다고 매번 데이터를 사용할때 마다 PassWord를 입력받기도 그렇고..
>> 일단 다음 코드로 SDE WorkSpace의 ConnectionString을 보았다.
   1: IDataset pWSDataSet = (IDataset)pDestDS.Workspace;
   2: IWorkspaceName2 pWorkspaceName = (IWorkspaceName2)pWSDataSet.FullName;
   3:  
   4: string sConStr = pWorkspaceName.ConnectionString;

>> 결과는 다음과 같다.

ENCRYPTED_PASSWORD=0002c45e2fbea2776344f09010b76e10bc831a5900;SERVER=192.xxx.xxx.xxx;INSTANCE=esri_sde;USER=kopss_ws;VERSION=SDE.DEFAULT;AUTHENTICATION_MODE=DBMS

>> ENCRYPTED_PASSWORD : 사용자가 입력한 PassWord 를 암호화 하여 저장하고 있다.

>> 구글링 및 EDN을 뒤져봤지만 Arc에서 암호화된 값을 복호화하는 방법은 찾을 수 없었다.

>> 결국 SDE 접속할때 강제로 암호화된 값(0002c45e2fbea2776344f09010b76e10bc831a5900)을 넣어 줬다.. 당연히 접속이 안된다.. ㅜㅜ

>> 그런데 의외로 방법은 간단했다.

>> 암호화된 ConnectionString을 그대로 저장했다가 다음 접속시 아래 코드처럼 ConnectionString 으로 접속이 가능했다..

   1: /// <summary>
   2: ///  SDE ConnectionString 으로 SDE Worksapce를 반환
   3: /// </summary>
   4: /// <param name="connStr">커넥션 스트링</param>
   5: /// <returns>IWorkspace</returns>
   6: public static IWorkspace OpenSDEWorkspaceByConStr(string connStr)
   7: {
   8:     IWorkspace workspace = null;
   9:  
  10:     try
  11:     {
  12:         IWorkspaceFactory pWSF = new SdeWorkspaceFactoryClass();
  13:         IWorkspaceFactory2 pWSF2 = (IWorkspaceFactory2)pWSF;
  14:  
  15:         workspace = pWSF2.OpenFromString(connStr, 0);
  16:     }
  17:     catch (Exception Ex)
  18:     {
  19:         System.Diagnostics.Debug.WriteLine(Ex.Message);
  20:     }
  21:  
  22:     return workspace;
  23: }

>> 결국 SDE에 접속하기 위한 암호를 알아낼 수는 없지만 ConnectionString을 통해 암호는 몰라도 접속은 가능했다.