배치파일 관리자 권한으로 실행
2024.07.23 18:38
안녕하세요?
같은 내용을 예전에 올렸습니다. https://windowsforum.kr/lecture/17680459
최근 좀 더 개선하여서 올려봅니다.^^
다음과 같은 꼭 필요한 사항이 고려되어야 할 것 같습니다.
- 사용자 권한이나 관리자 권한에서 실행시 오류 없을 것
- 사용자 권한에서 인수들과 같이 실행시 관리자 권한으로 전환 후 동일 인수로 전달될 것
테스트 환경
- 관리자 권한 파일 관리자나 에디터에서 실행,
- 사용자 권한 탐색기와 콘솔에서 실행
사소한 것들도 고려하여 저는 다음과 같이 정리하였습니다.
1, 인수 전달이 필요 없을 때,
- 쌍따옴표 필요 없는(스페이스를 포함하지 않는) 인수 전달시도 가능 '%* '
bcdedit >nul||(powershell start -v runas '%0' '%* '&exit/b)
- 파워쉘로도 인수 전달이 가능하나 공백을 포함한 인수 전달은 처리하기 어렵습니다.
- 공백 포함한 인수 전달은 좀 더 찾아보고 내용 추가하겠습니다. 안풀리네요ㅜㅜ
2. 인수 전달이 필요할 때,
- 인수 없이도 실행되고, 특히 인수에 쌍따옴표(스페이스가 포함된 인수)가 있어도 실행 가능
set "args=%*"& if defined args call set "args=%%args:"=""%%"
bcdedit>nul||mshta vbscript:close(createobject("shell.application").shellexecute("%ComSpec%","/c %~s0 %args%",,"runas",1))&&exit/b
특수문자 등이 충분히 고려되지는 않았습니다.
테스트 해보시고 좋은 의견 있으시면 올려주십시오. ^^
댓글 [10]
-
cungice 2024.07.23 19:08
-
지후빠 2024.07.26 09:36
감사합니다.^^
-
상발이 2024.07.23 19:15
수고하셨습니다.
-
지후빠 2024.07.26 09:36
감사합니다.^^
-
와로 2024.07.23 21:46
감사합니다
PE에서 테스트해봐야겠네요 ^^.
이게 여러 계정 환경과 특성을 고려해야해서 아리까리한 측면이 많더군요.
어떤 PE에선 잘 되는데 다이어트 빡세게 한 특정 PE에선 오류 뿜는 경우도 허다하고..
가끔 경험하는데 가장 흔하게 쓰이는 권한 취득 코드인 powershell,bcdedit,net session,mshta.exe를
아예 불러오지 못하거나 누락된 PE에선 접근 조차도 안됩니다.
임시 temp폴더에 관리자권한 콜하는 vbs파일 생성하는거 자체도 입구컷하는 경우도 있었구요
안되면 그 코드를 들어내던지 애초에 사용자 환경을 염두에 두지 않고 수동으로 관리자 권한 선택할수있게 기입하는게 나을수도 있습니다.
실컴에선 no트윅한 원본 윈도우의 users그룹 표준계정에서 먼저 테스트해봅니다.
여러 조건 따진결과 (net session >nul 2>&1)||(powershell start """%~0""" -verb runas & exit /b)
이 코드가 현재로선 가장 무난한거로 보이네요.
PsExec.exe 땡겨와서 먼저 사용자 환경 체크한후 시스템 권한으로 실행하는 방법도 있는데
이것도 복불복입니다.
reg add "HKCU\Software\Sysinternals\PsExec" /v EulaAccepted /t reg_dword /d 1 /f > nul 2>&1
if not "%1"=="admin" (powershell start -verb runas '%0' admin & exit /b)
if not "%2"=="system" (powershell . '%~dp0\PsExec.exe' /accepteula -i -s -d '%0' admin system & exit /b)
https://learn.microsoft.com/ko-kr/sysinternals/downloads/psexec
-
지후빠 2024.07.23 22:47
넵 공감합니다. 인터넷의 스크립트는 보통은 술술 넘어가지만 어떨때는 오류를 뿜더군요.^^
PE는 기본으로 관리자 권한이라 염두에 두지 않았습니다.
다만 실컴에서 관리자 권한 취득 코드를 넣은 스크립트가 PE에서 실행시 말썽은 없어야 하죠.
파워쉘 프롬프트 상에서는 백틱으로 쌍따옴표를 이스케이프하여 쌍따옴표가 포함된 인수를 다음 프로세스에 전달할 수 있는데, cmd 프롬프트상에서 powershell -command '코드' 부분에서는 그 방법이 먹히질 않아서 아직 방법을 찾지 못했습니다. 쌍따옴표를 넘길 필요 없는 스페이스가 없는 인수들에서는 가능하지만, 본문에 올린대로 인수는 vbs로 넘길 수 있어서 두가지로 단순화시켜 봤습니다. ^^
이전 게시물 댓글에 올려두고 필요할 때 복사해 쓰고 있는데 vbs 부분 코드 수정한 김에 두개로 간소화하여 올렸습니다.ㅎ~
가능한 외부툴 없이, 외부 파일 생성 없이, 단순한 구조로 구현할 수 있는 것으로...
-
강뉴 2024.07.24 23:10
수고하셨습니다
-
지후빠 2024.07.26 09:36
감사합니다.^^
-
지후빠 2024.07.26 10:46
댓글과 추천해주신 분들께 감사드립니다. ^^
-
DengJang 2024.09.01 01:28
파일 이름 ( ) 때문에 애먹었는데... 정말 감사합니다!
수고 많으셨습니다.