[C#] 관리자 권한으로 상승하여 프로그램 실행

Windows 운영체제는 시스템의 몇가지 중요한 정보를 변경을 수행하기 위해서 관리자 권한으로 실행되어져야 합니다. 예를 들어 COM 기반의 컴포넌트를 등록하기 위한 경우 관리자 권한이 아닌 경우 등록이 실패합니다. 아래의 코드는 C#으로 개발된 프로그램을 실행할 때 관리자 권한으로 프로그램이 실행될 수 있도록 하는데, Program.cs의 Main() 함수에 대한 전체 코드입니다.

[STAThread]
static void Main()
{
    if (IsAdministrator() == false) // 관리자 권한으로 실행되지 않는 경우라면 ..
    {
        try
        {
            ProcessStartInfo procInfo = new ProcessStartInfo();
            procInfo.UseShellExecute = true;
            procInfo.FileName = Application.ExecutablePath;
            procInfo.WorkingDirectory = Environment.CurrentDirectory;
            procInfo.Verb = "runas";
            Process.Start(procInfo);
        }
        catch (Exception ex)
        {
            // 사용자가 프로그램을 관리자 권한으로 실행하기를 원하지 않을 경우에 대한 처리
            MessageBox.Show(ex.Message);
            return;
        }
    } else { // 처음부터 프로그램은 관리자 권한으로 실행되고 있는 경우라면 ..
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

위의 코드에서 IsAdministrator 라는 함수가 보이는데요. 이 함수는 아래와 같습니다.

public static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
            
    if(identity != null)
    {
        WindowsPrincipal principal = new WindowsPrincipal(identity);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }

    return false;
}

위의 코드에서 참조하는 클래스를 인식하기 위해서는 다음을 import 문이 필요합니다.

using System.Security.Principal;
using System.Diagnostics;

GIS Server(GeoService-Xr)의 다중 DBMS Server 구성예

하나의 공간 서버(GeoService-Xr)에 대해 여러 개의 DBMS Server를 구성하는 경우에 대한 내용을 정리해 둡니다. 하드웨어적으로 다른 DBMS 서버는 물론이고, 동일한 서버에서 여러 개의 DBMS를 설치하거나, Port를 달리하거나 데이터베이스 명을 다르게 하여 분류해 사용하는 경우 모두 적용될 수 있습니다. 예를 들어 아래와 같은 구성 화면을 살펴보면..

하드웨어적으로 분리된 2개의 DBMS Server가 있으며, 192.168.0.200의 Server는 동일한 DBMS에서 Database 명을 달리해 구분하도록 되어 있습니다.

위의 구성에 대한 Geodata 설정 파일을 아래와 같습니다.

<?xml version="1.0" encoding="euc-kr"?>
<XrGeoData>
    <Connections>
        <Connection 
            name="db_server1" 
            type="postgis" 
            driverName="org.postgresql.Driver" 
            url="jdbc:postgresql://192.168.0.100:5432/gis" 
            user="postgres" 
            password="@#$%^" 
            count="32" 
        />

        <Connection
            name="db_server2" 
            type="postgis" 
            driverName="org.postgresql.Driver" 
            url="jdbc:postgresql://192.168.0.200:5432/gis" 
            user="postgres" 
            password="@#$%^" 
            count="32" 
        />

        <Connection
            name="db_server2_2" 
            type="postgis" 
            driverName="org.postgresql.Driver" 
            url="jdbc:postgresql://192.168.0.200:5432/gis2" 
            user="postgres" 
            password="@#$%^" 
            count="32" 
        />
  </Connections>

    <GeoDataList>
        <GeoData>
            <Name>ecl_facility</Name>
            <ConnectionString>db_server1://public."ecl_facility"</ConnectionString>
            <EPSG>5179
        </GeoData>

        <GeoData>
            <Name>swl_facility</Name>
            <ConnectionString>db_server2://public."swl_facility"</ConnectionString>
            <EPSG>5179
        </GeoData>
    </GeoDataList>
</XrGeoData>

위의 geodata 설정 내용 중 Connection의 name은 생략될 수 있으며, 만약 생략될 경우 type의 값으로 name이 대체됩니다.