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


213

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


6
ForcePush의 답변, 그의 해결 방법을 참조하십시오.
— Ubikuity

답변:


44

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

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

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

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


2
매우 유익한 정보 ... 로그온 스크립트는 대화 형 로그온 세션에 대해서만 실행되고 서비스 세션에는 실행되지 않는다고 가정하는 것이 정확합니까?
— VoidPointer

220

이 위험을 감수하십시오. (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 $에 의해 지원되지 않는다고 말할 수있는 방법입니다.


3
이 솔루션을 사용하려고 했는데이 문제가 발생했습니다. 매핑 된 드라이브가 사용자 (관리자조차도)와 연결이 끊어진 것으로 나타납니다. 어떤 제안?
— Constantin Baciu

7
재부팅 후 매핑 된 드라이브가 사라집니다. 어떤 아이디어? 매핑이 유지되지만 상태는 "사용할 수 없음"이므로 표시되지 않습니다.
— Tommy

4
또한 재부팅 후 매핑을 사용할 수없는 것으로 간주합니다.
— Dave Patterson

33
재부팅 후 작동하게하려면 technet.microsoft.com/en-us/library/cc770556.aspxnet use z: \\servername\sharedfolder 에 따라 컴퓨터 시작시 실행되도록 스크립트를 작성하여 설정 하십시오 . SYSTEM 계정으로 실행되므로 필요하지 않습니다. psexec.
— TRS-80

2
모든 사람이 절을 사용하는 것이 중요하다고 덧붙이고 싶습니다 /USER:[remotecomp]\[remoteusername] [password](원격 사용자 이름이 원격 컴퓨터 이름과 백 슬래시보다 우선 하지 않을 때 명령이 제대로 작동하지 않는 경우가 있습니다. 또한 공유가 암호로 보호되어 있고 다른 사람에게 연결이 끊어진 것으로 나타나는 경우 그것이, 운전 하지 모두 액세스 할 수있는 모든 사용자에게 시스템이 공유가 공유에 암호를 알아야합니다 마운트 해당 시스템에 (XPx64 테스트)..
— Kitet

65

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

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

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

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


무엇이 먼저 시작됩니까? Windows 서비스 또는이 예약 된 작업? 경로를 사용할 수없는 경우 시작시 서비스가 종료됩니다. 서비스가 마지막으로 시작되면이를 다시 빌드해야합니다.
— Thomas

1
2008 R2에서이 작업을 시도했는데 연결이 끊긴 매핑 된 드라이브가 생성되고 동일한 드라이브를 열려고하면 "z : \에 액세스 할 수 없습니다. 로그온 실패 : 알 수없는 사용자 이름 또는 암호가 잘못되었습니다"라는 메시지가 나타납니다. 그러나 동일한 bat 파일을 수동으로 실행하여 매핑 된 드라이브를 성공적으로 만들 수있었습니다. NY 통찰력?
— Gopi

1
@Thomas/persistent:yes
— Edd

4
예약 된 작업이 필요한 이유는 무엇입니까? 그것은 / persistent입니다 : 그렇습니다, 그것을 지키기에 충분하지 않습니까?
— Scott Stafford

2
@ScottStafford 아니오 / 영구 : 예 : Win7 이상에서는 충분하지 않습니다. 스위치와 관계없이 재부팅 후 매핑이 제거됩니다.
— Eternal21

44

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


매우 간단하고 잘 작동합니다. 파일 시스템의 일부이므로 모든 계정에서 링크를 사용할 수 있습니다. 서비스가 네트워크 리소스에 액세스 할 수있는 계정으로 실행되고 있는지 확인하십시오 (시스템 등의 경우에는 해당되지 않을 수 있음).
— Jeremy Frank

1
이것은 확실히 질문에 대한 더 나은 답변입니다. 대단히 감사합니다!
— Sten Petrov

3
안타깝게도 sym 링크가 네트워크 공유에 액세스하면 정사각형으로 돌아갑니다
— davidfrancis

23

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

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

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

1
서비스 내에서 권한 오류가 발생하여 디렉토리를 만들려고하면 어떻게됩니까?
— tyoc213

이 오프라인을 대화방으로 가져간 다음 오류 메시지의 세부 사항을 제공해야합니다. 높은 권한으로 명령을 실행해야 할 수도 있습니다.
— Philu

@ tyoc213 답변을 받았습니까?
— Lsakurifaisu

9

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

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

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

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


이 매핑 서비스 설정을 사용하면 매핑 서비스에 의해 설정된 드라이브 매핑을 원래 서비스의 컨텍스트에서 사용할 수 없다고 생각합니까?
— VoidPointer

나는 그것이 <disclaim>해야한다 </ disclaim> 생각합니다-각 winlogon 세션마다 하나의 환경이 있습니다.
— Treb

코드는 서비스에서 작동합니다. OP와 동일한 문제로 여기에 왔지만 서비스 작성자입니다. 당신의 대답은 내 문제를 해결했습니다.
— Joe Gayetty

5

힘,

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

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

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


4

Windows 서비스에 네트워크 드라이브에 대한 액세스 권한을 부여하는 방법을 찾았습니다.

NFS 디스크가있는 Windows Server 2012를 예로 들어 보겠습니다.

1 단계 : 마운트 할 배치 파일 작성

배치 파일을 작성하십시오 (예 : C : \ mount_nfs.bat).

echo %time% >> c:\mount_nfs_log.txt
net use Z: \\{your ip}\{netdisk folder}\ >> C:\mount_nfs_log.txt 2>&1

2 단계 : 디스크를 NT AUTHORITY / SYSTEM으로 마운트하십시오.

"작업 스케줄러"를 열고 새 작업을 만듭니다.

  1. "시스템 시작"에서 "SYSTEM"으로 실행하십시오.
  2. 조치 작성 : "C : \ mount_nfs.bat"를 실행하십시오.

이 두 가지 간단한 단계를 수행 한 후 Windows ActiveMQ 서비스는 "로컬 시스템"권한으로 실행되며 로그인없이 완벽하게 수행됩니다.


3

명령 프롬프트에서 실행 파일을 정상적으로 실행할 때 드라이브에 액세스 할 수있는 이유는 u를 일반 exe로 실행할 때 로그온 한 사용자 계정으로 해당 응용 프로그램을 실행하기 때문입니다. 그리고 해당 사용자는 네트워크에 액세스 할 수있는 권한이 있습니다. 그러나 실행 파일을 서비스로 설치하면 기본적으로 작업 관리에 'SYSTEM'계정으로 실행되는 것이 표시됩니다. 그리고 'SYSTEM'에는 네트워크 리소스에 액세스 할 수있는 권한이 없다는 것을 알고있을 것입니다.

이 문제에 대한 두 가지 해결책이있을 수 있습니다.

  1. 위에서 지적한대로 드라이브를 영구적으로 매핑합니다.

  2. 따를 수있는 방법이 하나 더 있습니다. 'services.msc'를 입력하여 서비스 관리자를 열면 서비스로 이동할 수 있으며 서비스 속성에는 계정을 '시스템'이외의 다른 계정으로 지정할 수있는 로그온 탭이 있습니다. 자신의 로그온 한 사용자 계정 또는 '네트워크 서비스'를 통해 서비스를 시작하십시오. 이 작업을 수행하면 .. 서비스는 네트워크 구성 요소 및 드라이브가 영구적이지 않은 경우에도 액세스 할 수 있습니다. 프로그래밍 방식으로이 작업을 수행하려면 http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx 에서 'CreateService'기능을 살펴보고 'lpServiceStartName'매개 변수를 'NT'로 설정할 수 있습니다 AUTHORITY \ NetworkService '입니다. '네트워크 서비스'에서 서비스를 시작합니다

  3. CreateService () 함수의 servicetype 매개 변수 플래그에 SERVICE_INTERACTIVE_PROCESS를 지정하여 서비스를 대화 형으로 만들 수도 있지만 Vista 및 7에서는이 기능을 지원하지 않으므로 XP까지만 제한됩니다.

솔루션이 도움이 되길 바랍니다. 이것이 도움이되었는지 알려주세요.


1

"시스템"에서 서비스가 실행되는 사용자를 변경하거나 시스템으로 매핑을 실행하는 은밀한 방법을 찾지 마십시오.

재미있는 점은 "at" 명령 을 사용하여 가능하며 1 분 후에 드라이브 매핑을 예약하면 시스템 계정으로 실행되어 드라이브가 서비스에 표시되도록하는 것입니다.


서비스는 "시스템"으로 실행되지 않습니다. 특정 로컬 계정으로 실행되도록 설정되어 있습니다. 해당 계정으로 로그인하여 영구 네트워크 매핑을 생성하고 로그 아웃 한 후 서비스를 다시 시작해도 매핑을 서비스에서 사용할 수 없습니다.
— VoidPointer

1

영구 드라이브에 의존하는 대신 드라이브를 사용할 때마다 드라이브를 매핑 / 매핑 해제하도록 스크립트를 설정할 수 있습니다.

net use Q: \\share.domain.com\share 
forfiles /p Q:\myfolder /s /m *.txt /d -0 /c "cmd /c del @path"
net use Q: /delete

이것은 나를 위해 작동합니다.


0

아직 댓글을 달 수 없지만 (평판 작업 중) @Tech Jerk @ spankmaster79 (좋은 이름 LOL)와 @NMC 문제에 답변하기 위해 계정을 만들었습니다. psexec는 추가 도구없이 작동하며 재부팅 후에도 유지됩니다. " @Larry가 작성한 게시물.

이에 대한 해결책은 로그인 한 계정 내에서 해당 폴더를 찾아 보는 것입니다.

    \\servername\share  

psexec에서 UNC에 사용한 것과 동일한 자격 증명을 입력하라는 메시지가 표시되도록합니다. 그 후 작동하기 시작합니다. 내 경우에는 서비스가있는 서버가 내가 매핑하는 서버와 동일한 도메인의 구성원이 아니기 때문이라고 생각합니다. UNC와 예약 된 작업이 모두 호스트 이름 대신 IP를 참조하는지 생각합니다.

    \\123.456.789.012\share 

문제를 완전히 피할 수 있습니다.

여기에 충분한 담당자가 표시되면 이것을 대신 회신으로 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.