[windows] 서비스에서 사용할 네트워크 드라이브 매핑

일부 Windows 서비스가 UNC 경로를 매핑하지 않고 매핑 된 네트워크 드라이브를 원하는 코드를 사용한다고 가정합니다. 서비스가 시작될 때 서비스 세션에서 드라이브 매핑을 사용 가능하게하려면 어떻게해야합니까? 서비스 사용자로 로그인하고 지속적 맵핑을 작성하면 실제 서비스 컨텍스트에서 맵핑이 설정되지 않습니다.



답변

세션 / 드라이브 액세스 문제와는 별도로 서비스를 수정하거나 도우미 프로세스 내부에 래핑해야합니다. 영구 드라이브 매핑은 일반적으로 서비스가 수행하지 않는 대화 형 로그온에서만 복원됩니다.

도우미 프로세스 접근 방식은 매우 간단 할 수 있습니다. 드라이브를 매핑하고 ‘실제’서비스를 시작하는 새 서비스를 만들면됩니다. 이것에 대해 완전히 사소한 것은 아닙니다 :

  • 도우미 서비스는 모든 적절한 SCM 명령 (시작 / 중지 등)을 실제 서비스에 전달해야합니다. 실제 서비스가 사용자 정의 SCM 명령을 허용하는 경우 해당 명령도 전달하는 것을 잊지 마십시오 (UNC 명령이 이국적인 명령을 사용한다고 생각하는 서비스는 기대하지 않습니다 …)

  • 자격 증명이 약간 까다로울 수 있습니다. 실제 서비스가 일반 사용자 계정으로 실행되는 경우 해당 계정으로도 도우미 서비스를 실행할 수 있으며 계정에 네트워크 공유에 대한 적절한 액세스 권한이있는 한 모두 정상이어야합니다. 실제 서비스가 LOCALSYSTEM 등으로 실행될 때만 작동한다면 네트워크 드라이브를 전혀 볼 수 없거나 자격 증명 저글링이 필요하기 때문에 상황이 더 흥미로워집니다.


답변

이 위험을 감수하십시오. (XP 및 Server 2008 x64 R2에서 테스트했습니다)

이 해킹 에는 Mark Russinovich의 SysinternalsSuite 가 필요합니다 .

1 단계 :
관리자 권한으로 실행 된 cmd.exe 프롬프트를 엽니 다.

2 단계 :
PSExec.exe를 사용하여 다시 루트로 상승 : SysinternalsSuite가 포함 된 폴더로 이동하여 psexec -i -s cmd.exe
현재 프롬프트 내에 있는 다음 명령 을 실행하고을
nt authority\system입력하여이를 증명할 수 있습니다 whoami. 는 -i드라이브 매핑이 사용자와 상호 작용해야하기 때문에 필요하다

3 단계 :
다음 명령을 사용하여 영구 매핑 된 드라이브를 SYSTEM 계정으로 만듭니다.
net use z: \\servername\sharedfolder /persistent:yes

그렇게 쉽습니다!

경고 : SYSTEM 계정에서 생성 한 것과 동일한 방식으로 만이 매핑을 제거 할 수 있습니다. 제거해야하는 경우 1 단계와 2 단계를 수행하되 3 단계의 명령을로 변경하십시오 net use z: /delete.

참고 : 새로 만든 매핑 된 드라이브는 이제이 시스템의 모든 사용자에게 표시되지만 “연결이 끊긴 네트워크 드라이브 (Z :)”로 표시됩니다. 이름이 당신을 속이게하지 마십시오. 연결이 해제되었다고 주장 할 수 있지만 모든 사람에게 효과적입니다. 이것이이 핵이 M $에 의해 지원되지 않는다고 말할 수있는 방법입니다.


답변

psexec를 사용하는 것과 유사한 솔루션을 찾았지만 추가 도구없이 작동 하며 재부팅 후에도 지속 됩니다.

간단히 실행 된 작업을 추가하고 “다음 계정으로 실행”필드에 “시스템”을 삽입 한 후 간단한 명령으로 작업을 배치 파일로 지정하십시오.

net use z: \servername\sharedfolder /persistent:yes

그런 다음 “시스템 시작시 실행”(또는 유사하게 영어 버전이 없음)을 선택하면 완료됩니다.


답변

mklink.exe를 사용하여 심볼릭 링크를 사용하는 것이 더 좋은 방법입니다. 모든 앱에서 사용할 수있는 파일 시스템에 링크를 만들면됩니다. http://en.wikipedia.org/wiki/NTFS_symbolic_link를 참조하십시오 .


답변

여기에 좋은 대답이 있습니다 :
https://superuser.com/a/651015/299678

즉, 예를 들어 심볼릭 링크를 사용할 수 있습니다

mklink /D C:\myLink \\127.0.0.1\c$


답변

‘net use’명령을 사용할 수 있습니다.

var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);

서비스에서 작동하지 않으면 Winapi 및 PInvoke WNetAddConnection2를 사용해보십시오.

편집하다: 분명히 당신을 오해했습니다-서비스의 소스 코드를 변경할 수 없습니다. 이 경우 mdb 의 제안을 따르지만 약간의 왜곡이 있습니다. 드라이브를 매핑하는 자체 서비스를 작성하십시오 (매핑 서비스라고 함).이 매핑 서비스를 첫 번째 (실제 작업) 서비스의 종속성에 추가하십시오. 이렇게하면 매핑 서비스가 시작되고 드라이브를 매핑하기 전에 작업 서비스가 시작되지 않습니다.


답변

힘,

노트 : 새로 만든 매핑 된 드라이브는 이제이 시스템의 모든 사용자에게 표시되지만 “연결이 끊긴 네트워크 드라이브 (Z :)”로 표시됩니다. 이름이 당신을 속이게하지 마십시오. 연결이 해제되었다고 주장 할 수 있지만 모든 사람에게 효과적입니다. 이것이 M $이이 핵을 지원하지 않는다고 말할 수있는 방법입니다.

모두 공유 권한에 따라 다릅니다. 공유 권한에 Everyone이 있으면 다른 사용자가이 매핑 된 드라이브에 액세스 할 수 있습니다. 그러나 배치 스크립트에서 자격 증명을 사용하고이 배치 스크립트가 시작 스크립트에 추가 된 특정 사용자 만있는 경우 시스템 계정 만 관리자가 아닌 해당 공유에 액세스 할 수 있습니다. 예를 들어, 예약 된 ntbackuo 작업을 사용하는 경우 ‘다음 계정으로 실행’에서 시스템 계정을 사용해야합니다. 서비스의 ‘로그온 : 로컬 시스템 계정’인 경우 작동합니다.

내가 한 일은 시작 스크립트에 드라이브 문자를 매핑하지 않고 net use \\\server\share ...예약 된 작업에서 UNC 경로를 사용 하고 사용했습니다. net use Z: \\\...동일한 자격 증명 으로 일부 드라이브 문자로 동일한 공유에 매핑하여 로그온 스크립트를 추가하거나 시작 파일 폴더에 배치 파일을 추가하면 됩니다. 이제 기록 된 사용자가 해당 매핑 된 드라이브를보고 액세스 할 수 있습니다. 동일한 공유에 2 개의 연결이 있습니다. 이 경우 사용자에게는 “연결이 끊어진 네트워크 드라이브 …”라는 메시지가 표시되지 않습니다. 그러나 UNC뿐만 아니라 드라이브 문자로 해당 공유에 액세스해야하는 경우 다른 드라이브 문자 (예 : 시스템의 경우 Y, 사용자의 경우 Z)로 공유하는 것을 매핑하십시오.