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


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.