[.NET] 시스템 환경변수 Path에 특정 경로 추가하기.

 

프로그램을 만들어 배포를 하게되면 경우에 따라 System 환경 변수의 Path를 건드려 주어야 할 때가 있다.

 

 

헌데 없어보이게  사용자에게 직접 환경변수를 추가하라고 할 수는 없는 노릇이고

제일 무난하고 편한 Install Factory로 해도, Install Shield 로 해도 방법이 없는것은 아니지만 해본결과 별루이다.

레지스트리를 직접 변경해주는 방식으로 하게 되는데, 이때 기존의 Path내용을 유지하면서 새로운것만 추가하기가 간단치 않다.

 

일단 '사용자 환경변수' 레지스트리의 위치는

 HKEY_CURRENT_USER\Environment\  이다.

사용자변수는 간단하다.

문제는 시스템 환경변수이다. 시스템환경변수는 최소 두군데 이상 동시에 존재한다.

일단 기본위치는

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

이곳이지만, 사용자계정에따라 ControlSet001, ControlSet002 ... 등등으로 나뉘어진다.

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment

어드메 있는것을 바꿔야 하는지까지는 잘 모르겠다. 이미 이렇게 널부러져 있는것을 확인한순간 다른방법을 고민했으니..

 

 

.NET에는 System.Environment 라는 훌륭한 클래스가 기본제공되질 않는가!

그래서 방법은 프로그램 실행시 시스템 환경변수값을 불러다가  내가 추가하고자 하는 경로가 이미 존재하면 제껴버리고,

없으면  맨앞에 경로를 하나 추가해서 다시 셋팅해주는 것이다.

그게 ControlSet001이 수정되야 하는지 002가 수정되야 하는지, 아니면 CurrentControlSet 에서 수정되야 하는지 알필요 따윈 없다.

어차피 이 프로그램이 System.Environment 가  찾아내준 위치의 시스템환경변수값만 조작해주면 DLL을 불러들이는데는 지장이 없으니까.

 

그래서 작성한 코드.

 

    Public Shared Sub SystemPathControl(AppPath As String)

        Dim _sysPath As String = System.Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine)
        Dim oldPath() As String = _sysPath.Split(";")
        Dim newPath As New StringBuilder

        If Not oldPath.Contains(AppPath) Then
            newPath.Append(AppPath + ";")
            For Each ePath As String In oldPath
                newPath.Append(ePath + ";")
            Next
            System.Environment.SetEnvironmentVariable("Path", newPath.ToString, EnvironmentVariableTarget.Machine)
        End If

    End Sub

 

 

사용된 클래스는 보시다시피..

System.Environment.GetEnvironmentVariable("Path", EnvironmentVariableTarget.Machine)

System.Environment.SetEnvironmentVariable("Path", newPath.ToString, EnvironmentVariableTarget.Machine)

이 되겠다.

Get으로 Machine(시스템) 환경변수 중 Path를 가져와서 매개변수로 들어온 AppPath값이 있는지 찾아보구

없으면 젤앞에 AppPath를 붙이고 나머지껄 줄줄이 이어붙여서 newPath를 만들어준 다음

Set으로 다시 Machine의 Path값을 바꿔주는 초간단 함수가 되겠다.

Get/Set EnvironmentVariable 메서드의 마지막 매개변수는 사용자/시스템 변수값에 대한 상수이다.

시스템변수는 EnvironmentVariableTarget.Machine

사용자변수는 EnvironmentVariableTarget.User

 

 

이제 이것을 프로그램 시작할때 도는 프로시져 한귀퉁이에서 호출해주면 되시겠다.

사실 이 행위를 플그램 실행때마다 매번 하는게 솔직히 비효율적일 수가 있다.

어디서 지나가다 주워본것 같은데, 닷넷은 배포후 최초 실행되었는지를 리턴해주는 함수가 있다고 봤다(다시 찾아보려니 찾을수가 없지만 ㅜㅜ)

이걸 조합한다면  프로그램 인스톨 후 최초 실행시에만 한번 돌려주도록 만들 수도 있을것이다.

 

최초실행여부를 확인해 주는 함수를 아시는분은 댓글로 제보좀 부탁드립니다 ㅋㅋ 

+ Recent posts