문제

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

도움이 되었습니까?

해결책

서비스를 수정하거나 도우미 프로세스 안에 래핑해야합니다. 세션/드라이브 액세스 문제와는 별도로, 지속적인 드라이브 매핑은 인터랙티브 로그온에서만 복원되며, 이는 일반적으로 수행되지 않습니다.

도우미 프로세스 접근 방식은 매우 간단 할 수 있습니다. 드라이브를 매핑하고 '실제'서비스를 시작하는 새로운 서비스를 만듭니다. 이것에 대해 전적으로 사소하지 않은 유일한 것은 다음과 같습니다.

  • 도우미 서비스는 모든 적절한 SCM 명령 (시작/정지 등)을 실제 서비스로 전달해야합니다. 실제 서비스가 사용자 정의 SCM 명령을 수락하는 경우에도 통과해야합니다 (UNC 경로가 이국적인 경로를 이국적인 명령을 사용하는 것으로 간주하는 서비스는 기대하지 않습니다 ...)

  • 상황이 약간 까다로워 질 수 있습니다. 실제 서비스가 일반 사용자 계정에 따라 실행되는 경우 해당 계정에서도 헬퍼 서비스를 실행할 수 있으며 계정에 네트워크 공유에 적절한 액세스 권한이있는 한 모든 것이 괜찮습니다. 실제 서비스가 로컬 시스템 또는 SomeSuch로 실행될 때만 작동하는 경우 네트워크 드라이브를 전혀 볼 수 없거나 작업을 수행하기 위해 자격 증명이 필요하지 않기 때문에 상황이 더 흥미로워집니다.

다른 팁

이것을 당신 자신의 위험에 사용하십시오. (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 단계 :다음 명령으로 시스템 계정으로 영구 매핑 드라이브를 만듭니다.net use z: \\servername\sharedfolder /persistent:yes

그렇게 쉬워요!

경고: 시스템 계정에서 만든 것과 같은 방식 으로이 매핑 만 제거 할 수 있습니다. 제거 해야하는 경우 1 단계와 2 단계를 따르지만 3 단계에서 명령을 변경하십시오. net use z: /delete.

노트: 새로 생성 된 매핑 된 드라이브는 이제이 시스템의 모든 사용자에게 나타나지만 "Distronceded Network Drive (z :)"로 표시됩니다. 이름이 당신을 속이게하지 마십시오. 연결이 끊어 졌다고 주장 할 수 있지만 모든 사람에게 효과적입니다. 그것이 당신 이이 해킹이 m $에 의해 지원되지 않는다고 말할 수있는 방법입니다.

PSEXEC가있는 것과 유사한 솔루션을 찾았지만 작동하는 솔루션을 찾았습니다. 추가 도구가없고 재부팅으로 살아남습니다.

Sheduled Task를 추가하고 "런으로"필드에 "시스템"을 삽입하고 간단한 명령으로 작업을 배치 파일에 가리 킵니다.

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

그런 다음 "System Startup에서 실행"(또는 이와 유사하게 영어 버전이 없음)을 선택하면 완료됩니다.

더 좋은 방법은 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, 그러나 약간의 변형이 있습니다.드라이브를 매핑하는 자체 서비스(매핑 서비스라고 함)를 만들고 이 매핑 서비스를 첫 번째(실제 작업) 서비스에 대한 종속성에 추가합니다.이렇게 하면 매핑 서비스가 시작되고 드라이브를 매핑하기 전에 작업 서비스가 시작되지 않습니다.

포셉 셔,

노트: 새로 생성 된 매핑 된 드라이브는 이제이 시스템의 모든 사용자에게 나타나지만 "Distronceded Network Drive (z :)"로 표시됩니다. 이름이 당신을 속이게하지 마십시오. 연결이 끊어 졌다고 주장 할 수 있지만 모든 사람에게 효과적입니다. 그것이 당신 이이 해킹을 M $에 의해 지원하지 않는다고 말할 수있는 방법입니다.

그것은 모두 주식 권한에 따라 다릅니다. 주식 권한에 모든 사람이있는 경우이 매핑 드라이브는 다른 사용자가 액세스 할 수 있습니다. 그러나 배치 스크립트에 사용한 자격 증명 과이 배치 스크립트가 시작 스크립트에 추가 된 특정 사용자 만있는 경우 시스템 계정 만 해당 공유에 액세스 할 수 있습니다. 예를 들어, 예약 된 ntbackuo 작업을 사용하는 경우 'run as'에서 시스템 계정을 사용해야합니다. 서비스의 '로그온 : 로컬 시스템 계정'이 작동하는 경우 작동해야합니다.

제가 한, 나는 시작 스크립트에 드라이브 문자를 매핑하지 않았다. net use \\\server\share ... 예정된 작업에서 UNC 경로를 사용했습니다. 로그온 스크립트를 추가하거나 일부 드라이브 문자와 함께 매핑을 통해 매핑을 사용하여 시작 폴더에 배치 파일을 추가하십시오. net use Z: \\\... 동일한 자격 증명으로. 이제 기록 된 사용자는 매핑 된 드라이브를보고 액세스 할 수 있습니다. 같은 지분과 2 개의 연결이 있습니다. 이 경우 사용자는 성가신 "연결이 끊어진 네트워크 드라이브 ..."를 보지 못합니다. 그러나 UNC가 아닌 드라이브 문자로 해당 공유에 액세스 해야하는 경우 다른 드라이브 문자와 공유하는지도, 예를 들어 시스템 및 사용자의 경우 Z를 공유하십시오.

네트워크 드라이브에 대한 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 권한/시스템으로 마운트합니다.

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

  1. "시스템 시작"에서 "시스템"으로 실행하십시오.
  2. 액션 만들기 : "c : mount_nfs.bat"를 실행하십시오.

이 두 가지 간단한 단계 후에는 Windows ActiveMQ 서비스가 "로컬 시스템"Priviledge에서 실행되며 로그인하지 않고 완벽하게 수행합니다.

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

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

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

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

  3. CreateService () 함수의 ServiceType 매개 변수 플래그에서 Service_Interactive_process를 지정하여 서비스를 대화식으로 만들어서 시도 할 수도 있지만 XP까지 Vista로만 제한되며 7 Donot 은이 기능을 지원합니다.

솔루션이 도움이되기를 바랍니다. 이것이 당신을 위해 효과가 있는지 알려주세요.

서비스가 "시스템"에서 실행되도록 사용자를 변경하거나 시스템으로 매핑을 실행할 수있는 교활한 방법을 찾지 않아도됩니다.

재미있는 점은 이것이 사용하여 가능하다는 것입니다. "에" 명령, 단순히 드라이브 매핑을 향후 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

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

아직 댓글을 달 수 없지만 (평판 작업) @tech uk @spankmas PSEXEC는 추가 도구없이 작동하며 재부팅에서 살아남습니다. " 게시물 @larry가 만들었습니다.

이에 대한 해결책은 로그인 된 계정 내에서 해당 폴더로 탐색하는 것입니다.

    \\servername\share  

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

    \\123.456.789.012\share 

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

여기에 충분한 담당자 포인트를 얻으면 대신 답장으로 추가하겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top