2009년 8월 19일 수요일

%~dp0

최근에 해외 어둠의 툴 배치스크립트를 보고 위 변수(?)를 보게 되었는데 해당 배치파일의 실행폴더를 그대로 받아주더군요.

 

비스타에선 문제가 없었던 것 같은데 윈도우 7의 경우 UAC가 켜져있는 상태로 배치파일에 우클릭 해서 관리자 권한으로 실행을 하면 System32 경로에서 스크립트가 실행되기 때문에 파일 복사시에 지정된 경로를 찾지 못해서 에러가 발생하는 문제가 있었습니다.

 

이제 관리자 권한이 필요하면서 동시에 파일 복사 명령어가 들어가는 스크립트 실행시 더이상 Admin 계정을 활성화 시켜셔 스크립트를 실행할 필요는 없을 것 같습니다.

 

 

 

 

 

(예제)

 

※ data 라는 폴더와 배치파일이 동일한 위치에 존재하는 경우를 가정

 

xcopy data\spp\tokens %windir%\System32\spp\tokens /cheriky

 

위와같은 명령줄이 배치파일에 들어있는 경우 만약 UAC 켜진 상태로 우클릭해서 관리자 권한으로 실행했다면

 

C:\Windows\System32\data\spp\tokens

 

라는 경로를 찾기 때문에 지정된 경로를 찾을 수 없다고 나오면서 복사 에러가 납니다.

 

하지만

 

xcopy %~dp0data\spp\tokens %windir%\System32\spp\tokens /cheriky

 

라고 넣으면 UAC가 켜져있는 상태에서 우클릭 - 관리자 권한으로 실행을 했다고 하더라도 정상적으로 파일 복사가 이루어집니다.

 

 

 

(추가1)

가만히 생각해보니 그냥 스크립트 시작 부분에

 

cd "%~dp0"

 

를 넣어서 실행 위치를 System32에서 배치파일이 존재하는 위치로 이동시킨 다음 작업하는게 편리할 것 같네요 ^^

 

 

 

(추가2)

cd 명령어는 디렉터리 변경만 가능하고 드라이브가 다르면 옮겨지지 않습니다.

따라서 해당 파일이 윈도우가 설치된 파티션과 다른 드라이브에 있다면

 

pushd "%~dp0"

 

해주시면 스크립트 위치로 이동이 됩니다.

 

댓글 27개:

  1. 보안을 공부하고 있는데.. 보안적인 측면에서도 상당히 유용한 정보가 되겠네요. 좋은 정보 감사합니다.

    답글삭제
  2. 쉽게 말해서 이런 건가요?



    어떤 곳에 a라는 디렉토리가 있습니다.

    a라는 디렉토리에는 배치파일과 data 폴더가 있고.

    배치파일은 data 폴더에 있는 파일을 D:/archive로 옮기는 일을 합니다.



    이 때 xcopy /data d:/archive로 하면 에러가 나지만 xcopy %~dp0/data d:/archive로 한다면 잘 된다는 거죠?

    제가 이해하는 게 맞다면 이거 대박이네요. 감사합니다.

    답글삭제
  3. @까만거 - 2009/08/19 09:04
    그런가요? 전 초보라서 이게 보안에 어떤 의미를 가지는지는 잘 모르겠네요 ㅎ

    답글삭제
  4. @아무개 - 2009/08/19 09:33
    그런 개념인거 같은데 이 현상은 윈도우 7에서 배치스크립트를 UAC가 켜진 상태에서 우클릭 - 관리자 권한으로 실행했을 때만 발생하는 문제더군요. 그냥 더블클릭으로 실행하거나 관리자 계정에서 실행하거나 UAC가 꺼진 상태에서 실행하면 스크립트가 해당 폴더 위치에서 바로 실행이 되어서 아무런 문제가 없었습니다. 즉 일반적으론 그냥 스크립트와 DATA 라는 폴더가 같은 위치에 존재한다면 data 라는 경로만 넣어도 된다는 것이지요.

    답글삭제
  5. 그렇다면.. UAC켜져있구 배치파일로 파일을 복사하려면 %~dp0를 써야한다는 건데....

    이거 엄밀히 따지면 win7의 결함이 아닌가요?

    관리자 권한 실행의 유연성이 떨어지는 좋은 예시네요.

    답글삭제
  6. @EXCEED - 2009/08/19 09:55
    "UAC 켜져있는 상태에서 우클릭 해서 관리자 권한으로 배치스크립트를 실행했을 경우"



    라고 해야겠네요. 비스타에선 분명 문제가 없었던 것 같은데...

    답글삭제
  7. @snoopy - 2009/08/19 09:54
    아, 그렇군요.좋은 정보 감사합니다. (__)

    그런데 혹시 .iso를 어느 디렉토리에 푸는 전문 MS의 無GUI 툴이 혹시 있나요? 테크넷 뒤져보니 OSCDIMG가 .iso 푸는 것 빼고 AIK에는 없는 것 같은디..

    답글삭제
  8. 오호! 신기하네요..오늘도 또 하나 배워갑니다..

    답글삭제
  9. @아무개 - 2009/08/19 09:33
    oscdimg에 그런 기능이 있나요? 일단 저는 MS 툴중에 ISO 푸는게 있는지는 모르겠습니다.

    답글삭제
  10. @만두사랑 - 2009/08/19 12:28
    이런거 관련해서 특정 문자열 받아주는 변수가 많이 있긴 있던데 저도 공부 좀 해보려니 귀찮아서 ^^;;

    답글삭제
  11. EXCEED님 말씀이랑은 조금 다른 생각입니다.

    일곱이의 결함이라기 보다 보안성에서 더 높은 우위와 안정성을 유지하려 그러는것 같네요. 뭐 팩킹하는 사람들의 악용을 막기 위해서 그러는 것 같습니다.

    모두가 잘 사용하기 위해서 하는 분들도 계시지만, 더러 악용하는 사람들이 있으니 말이죠. SYSTEM32폴더는 윈도우에서 중추에 해당하는 곳이라서 말이죠.

    덕분에 괜찮은 걸 얻고 가네요. ^^

    답글삭제
  12. @Kals R. Styner - 2009/08/19 12:49
    동감입니다.

    답글삭제
  13. 이 글 보고 문뜩 뭔가 떠올라서 관련된 실험을 하나 해보려고 준비 중인데 어떤 결과가 나올지 궁금하네요. ;ㅁ;

    답글삭제
  14. @deVbug - 2009/08/19 13:35
    왠지 제가 떠올리는 실험과 같은걸 해보려고 하시는것 같군요..ㅎㅎ

    답글삭제
  15. @snoopy - 2009/08/19 12:39
    잘못 쓴 겁니다. OSCDIMG는 압축만 하는 것으로 알고 있는데..^^;;

    답글삭제
  16. 한여름의 중간에 무더운데 잘지내시는가 항상 많은정보 공유해줘 수고가 많군요 더위에 건강 조심하시길 지나가다가 흔적 남깁니다~

    답글삭제
  17. @deVbug - 2009/08/19 13:35
    고수님들이 과연 무슨 재미있는 일을 꾸미시고 계신지 궁금하네요 ㅎㅎ

    답글삭제
  18. @Bardisch - 2009/08/19 14:27
    알아두면 가끔 써먹을 일은 있을 듯 하네요 ^^

    답글삭제
  19. @작은아빠 - 2009/08/19 15:46
    제가 일하는(?) 곳과 사는 집에 에어컨은 마음대로 빵빵하게 틀 수 있어서 여름 더운줄 모르고 지내고 있습니다. ^^

    답글삭제
  20. 스크립트 소스가 어디서 많이 본거네요. 하하.



    이왕 하려면, 좀더 알기 쉽게 네이밍 좀 하지,

    "%~dp0"게 뭡니까...

    마소 msdn 펑션들은 이름 길게 잘 해놨더만, 이건 왜 이렇게 한건지...

    답글삭제
  21. @무느미 - 2009/08/19 16:18
    for /?



    해보니까 도움말에 %~ 관련 변수가 많이 나오더라구요. 근데 전 무슨말인지 몰라서 ㅎㅎ for 구문 익혀두면 스크립트 짜는데 참 유용하겠던데 ㅠㅠ

    답글삭제
  22. @snoopy - 2009/08/19 15:52
    ㅜㅠ

    재미도 없게, 원하던 결과가 안 나왔어요. [...]

    큭.. ;ㅁ;..

    답글삭제
  23. @deVbug - 2009/08/19 13:35
    ㅠㅠ 그래도 뭔가 새로운 실험을 한다는건 재미있는 일이지요 ^^

    답글삭제
  24. @Digital NEX - 2009/08/20 14:19
    댓글이 너무 길다 ㅡㅡ^



    하지만 오랜만에 와서 반갑다 ^^

    답글삭제
  25. 핫ㅋㅋ 들어와봤더니 배치에 대한 포스팅이 있군요.



    요즘 배치가지고 별짓다하는 저한테는 상당히 솔깃한 포스팅이네요 ㅎㅎ



    참고로 더 알려드리자면



    %~d0 드라이브(drive)

    %~p0 경로(path)

    %~n0 파일명(name)

    %~x0 확장자(이건 컴맹이라 모르겠습니다 T^T)



    이렇습니다. %~이후문자는 맘대로 써도 됩니다.



    %~dpnx0 이렇게쓰면 드라이브 경로 파일명 확장자가 전부뜹니다 ㅋ

    답글삭제
  26. @snoopy - 2009/08/20 00:31
    앗; 다시보니 너무 길군요 ㅋ



    쓸데없는말은 빼버렸습니다 T^T)

    답글삭제