제    목  : [Vista] Admin 권한으로 실행되는 프로그램 만들기 (VB6)
작 성 일  : 2007년 03월 14일
작 성 자  : 제용재 (182cm@korea.com)
개발환경  : Visual Basic 6.0
분    류  : Development -> Visual Basic
키 워 드  : Visual Basic, Vista, UAC, rc.exe, mt.exe
요    약  : Admin 계정으로 로그인했더라도 프로그램을 실행시키면 일반 사용자 권한으로 프로그램이 실행된다.
            Admin 권한으로 실행 시키기 위해서는 "관리자 권한으로 실행"을 이용하거나 권한 관련 속성 정보를 변경해야만 한다.



Vista에서는 UAC(User Account Control, 사용자 계정 관리) 기능을 통해 프로그램 실행에 대한 권한을 강화했는데, 일반 사용자 권한으로 실행되는 프로그램에서는 시스템 폴더, Program Files 폴더, 레지스트리 제어 등에 있어 많은 제약이 따르게된다.

UAC 기능을 고려하지 않은 프로그램을 Admin 권한으로 실행하는 방법은 다음과 같다.

    1. Vista 제어판을 통해 UAC 기능을 중지 시킨다. (비추)
        - UAC 기능이 불편함을 초래할 수는 있으나, 사용자 모르게 임의로 실행되는 악성
          프로그램 등으로부터 보호하는 기능을 가지고 있으므로 가급적 사용을 권장한다.
    2. 실행 파일에서 오른쪽 버튼 클릭 후 "관리자 권한으로 실행" 메뉴 선택
        - 경우에 따라 Admin 권한을 부여하기 위한 일회성 방법이다.
        - "사용자 계정 컨트롤"의 권한 상승 화면을 거쳐야 한다.
    3. 실행 파일의 속성->호환성 탭에서 "관리자 권한으로 이 프로그램 실행" 체크
        - 속성 변경 후에는 자동으로 Admin 권한으로 실행된다.
        - "사용자 계정 컨트롤"의 권한 상승 화면을 거쳐야 한다.
        - 파일명을 변경하거나 위치(폴더)를 이동하는 경우, "권한 수준" 내용을 초기화 된다.

 
Vista에서 Admin 권한으로 실행되는 프로그램을 만들기 위해서는 manifest 파일을 리소스에 포함시키면 되는데 VB6의 리소스 편집기에서는 manifest 리소스 관리를 지원하지 않으므로 [1]VS6의 rc.exe 프로그램을 이용해서 리소스 파일을 만들고 이 리소스 파일을 포함해서 컴파일한다. 또는 [2]VS2005의 mt.exe를 이용해서 이미 컴파일 된 프로그램에 manifest 정보를 추가한다.

[1] manifest 리소스 정보를 포함해서 컴파일하는 방법

1) manifest 파일 만들기
    - 다음의 내용을 텍스트 파일로 저장한다. (파일명 : "app_name.exe.manifest")
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="AdminApp"
     type="win32"/>

  <description>Description of your application</description>
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>

        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>


2) ResourceScript 파일 만들기
    - 다음의 내용을 텍스트 파일로 저장한다. (파일명 : ResourceScript.rc)
#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST                     24
CREATEPROCESS_MANIFEST_RESOURCE_ID   RT_MANIFEST    "app_name.exe.manifest"


3) rc.exe 를 이용한 리소스 파일 만들기
    - 도스창에서 다음의 명령을 입력해서 리소스 파일을 만든다.
    - "c:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\" 폴더에 있다.
"RC.EXE" /r /fo app_name.res ResourceScript.rc


4) VB 프로젝트에 리소스 파일 추가
   - VB에서 프로젝트->파일 추가 메뉴를 통해 3)에서 만든 리소스 파일(app_name.res)을 프로젝트 리소스 파일로 등록한다.

5) 프로젝트 컴파일

6) Vista의 UAC 사용 환경에서 테스트


[2] VS 2005의 mt.exe를 이용하는 방법

1) Admin 권한 부여를 위한 프로그램(EXE) 준비

2) manifest 파일 만들기 ([1]과 동일)

3) 실행 파일에 manifest 정보 추가하기

mt -manifest app_name.exe.manifest -outputresource:app_name.exe;#1


4) Vista의 UAC 사용 환경에서 테스트


※ manifest 적용 후에는 다음 그림처럼 방패 모양이 추가되는 것을 볼 수 있다. (Vista에서 확인 가능)
사용자 삽입 이미지사용자 삽입 이미지


※ manifest 적용 및 테스트를 위한 예제 프로젝트


vb_vista_exe_admin.zip




☞ 본문 출처 : http://www.enjoydev.com/blog/107(새 창으로 열기) 



타 서버간의 쿼리문을 사용하고 싶을때 이용한다.



EXEC sp_addlinkedserver 
@server='서버별칭',
@srvproduct = '',
@provider = 'SQLOLEDB',
@datasrc = 
'서버주소',@provstr='Provider=SQLOLEDB;Data Source=서버주소;Initial Catalog=데이터베이스명;User id=사용자명; Password=비밀번호;',
@catalog='데이터베이스명'
GO


EXEC sp_addlinkedsrvlogin '서버별칭', 'false', NULL, '사용자명', '비밀번호' 
GO


확인방법

SELECT * FROM [서버별칭].[데이터베이스명].[dbo].[sysfiles]
GO



<SCRIPT LANGUAGE="JavaScript">
<!--
function gstart(){
 Starter.sID = '사용자아이디'//웹에 로그인한 유져의 ID
 Starter.sIP = '아이피'
 Starter.sPort = '포트번호'
 Starter.sCode = '1'
 Starter.sName = '이름'
 Starter.sUpdateURL = 'http://경로명/download.txt'  //업데이트목록으로 구성된 업데이트파일의 경로
 Starter.sDownloadURL = 'http://경로명/update.txt'  //다운로드파일의 경로가 있는 파일의 경로
 Starter.srun = '0'
}
//-->
</SCRIPT>

<OBJECT ID="Starter"
CLASSID="CLSID:2BAF3423-F48B-449F-B80B-000B2BC9A8D7"
CODEBASE="http://경로명/cab파일명.CAB#version=1,0,0,0" width=1 height=1>
</OBJECT>



   Header("Cache-Control: cache, must-revalidate");
   Header("Pragma: no-cache");   
   Header("Expires: 0");  

다운로드 헤더 맨아래쪽에 위 세줄을 추가한다.
사용법 : Request.ServerVariables("[헤더값]")

ALL_HTTP
ALL_RAW
APPL_MD_PATH
APPL_PHYSICAL_PATH
AUTH_TYPE
AUTH_USER
AUTH_PASSWORD
LOGON_USER
REMOTE_USER
CERT_COOKIE
CERT_FLAGS
CERT_ISSUER
CERT_KEYSIZE
CERT_SECRETKEYSIZE
CERT_SERIALNUMBER
CERT_SERVER_ISSUER
CERT_SERVER_SUBJECT
CERT_SUBJECT
CONTENT_LENGTH
CONTENT_TYPE
GATEWAY_INTERFACE
HTTPS
HTTPS_KEYSIZE
HTTPS_SECRETKEYSIZE
HTTPS_SERVER_ISSUER
HTTPS_SERVER_SUBJECT
INSTANCE_ID
INSTANCE_META_PATH
LOCAL_ADDR
PATH_INFO
PATH_TRANSLATED
QUERY_STRING
REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REQUEST_METHOD
SCRIPT_NAME
SERVER_NAME
SERVER_PORT
SERVER_PORT_SECURE
SERVER_PROTOCOL
SERVER_SOFTWARE
URL
HTTP_CONNECTION
HTTP_ACCEPT
HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE
HTTP_COOKIE
HTTP_HOST
HTTP_USER_AGENT

$_SERVER["HTTP_HOST"] = 접속을 시도한 도메인 헤더값

$_SERVER["HTTP_REFERER"] = 현재페이지로 오기전의 페이지주소값

$_SERVER['DOCUMENT_ROOT'] = 현재 사이트가 위치한 서버상의 위치 = webappinclude

$_SERVER['HTTP_ACCEPT_ENCODING'] = 인코딩 방식 = gzip, deflate


$_SERVER['HTTP_ACCEPT_LANGUAGE'] = 언어 = ko

$_SERVER['HTTP_USER_AGENT'] = 사이트 접속한 사용자 환경 = Mozilla4.0(compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705

$_SERVER['REMOTE_ADDR'] = 사이트 접속한 사용자 IP = xxx.xxx.xxx.xxx

$_SERVER['SCRIPT_FILENAME'] = 실행되고 있는 위치와 파일명 = webappincludeindex.php

$_SERVER['SERVER_NAME'] = 사이트 도메인 = www.badungi.pe.kr


 

$_SERVER['SERVER_PORT'] = 사이트가 사용하는 포트 = 80

$_SERVER['SERVER_SOFTWARE'] = 서버의 소프트웨어 환경 = Apache1.3.23 (Unix) PHP4.1.2 mod_fastcgi2.2.10 mod_throttle3.1.2 mod_ssl2.8.6 OpenSSL0.9.6c

$_SERVER['GATEWAY_INTERFACE'] = cGI 정보 = CGI1.1

$_SERVER['SERVER_PROTOCOL'] = 사용된 서버 프로토콜 = HTTP1.1

$_SERVER['REQUEST_URI'] = 현재페이지의 주소에서 도메인 제외 =  index.phpuser=&name=

$_SERVER['PHP_SELF'] = 현재페이지의 주소에서 도메인과 넘겨지는 값 제외 = index.php

$_SERVER['APPL_PHYSICAL_PATH'] = 현재페이지의 실제 파일 주소 = Dwebapp

 


1.새 호스트(A) 추가
  - 이름: mail
  - IP주소 : 218.236.90.205(가입년도에따라 틀릴수있음)

2.새 메일 교환기(MX)
  - 호스트 또는 자식도메인 : [공란] 
  - 메일 서버의  정규화된 도메인 이름 : mail.도메인
  - 메일 서버 우선 순위 : 10


설정후 일정시간이 지나야 사용가능하다.

+ Recent posts