답변:
세션 / 드라이브 액세스 문제와는 별도로 서비스를 수정하거나 도우미 프로세스 내부에 래핑해야합니다. 영구 드라이브 매핑은 일반적으로 서비스가 수행하지 않는 대화 형 로그온에서만 복원됩니다.
도우미 프로세스 접근 방식은 매우 간단 할 수 있습니다. 드라이브를 매핑하고 '실제'서비스를 시작하는 새 서비스를 만들면됩니다. 이것에 대해 완전히 사소한 것은 아닙니다 :
도우미 서비스는 모든 적절한 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 $에 의해 지원되지 않는다고 말할 수있는 방법입니다.
net use z: \\servername\sharedfolder
에 따라 컴퓨터 시작시 실행되도록 스크립트를 작성하여 설정 하십시오 . SYSTEM 계정으로 실행되므로 필요하지 않습니다. psexec.
/USER:[remotecomp]\[remoteusername] [password]
(원격 사용자 이름이 원격 컴퓨터 이름과 백 슬래시보다 우선 하지 않을 때 명령이 제대로 작동하지 않는 경우가 있습니다. 또한 공유가 암호로 보호되어 있고 다른 사람에게 연결이 끊어진 것으로 나타나는 경우 그것이, 운전 하지 모두 액세스 할 수있는 모든 사용자에게 시스템이 공유가 공유에 암호를 알아야합니다 마운트 해당 시스템에 (XPx64 테스트)..
psexec를 사용하는 것과 유사한 솔루션을 찾았지만 추가 도구없이 작동 하며 재부팅 후에도 지속 됩니다.
간단히 실행 된 작업을 추가하고 "다음 계정으로 실행"필드에 "시스템"을 삽입 한 후 간단한 명령으로 작업을 배치 파일로 지정하십시오.
net use z: \servername\sharedfolder /persistent:yes
그런 다음 "시스템 시작시 실행"(또는 유사하게 영어 버전이 없음)을 선택하면 완료됩니다.
/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)로 공유하는 것을 매핑하십시오.
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으로 마운트하십시오.
"작업 스케줄러"를 열고 새 작업을 만듭니다.
이 두 가지 간단한 단계를 수행 한 후 Windows ActiveMQ 서비스는 "로컬 시스템"권한으로 실행되며 로그인없이 완벽하게 수행됩니다.
명령 프롬프트에서 실행 파일을 정상적으로 실행할 때 드라이브에 액세스 할 수있는 이유는 u를 일반 exe로 실행할 때 로그온 한 사용자 계정으로 해당 응용 프로그램을 실행하기 때문입니다. 그리고 해당 사용자는 네트워크에 액세스 할 수있는 권한이 있습니다. 그러나 실행 파일을 서비스로 설치하면 기본적으로 작업 관리에 'SYSTEM'계정으로 실행되는 것이 표시됩니다. 그리고 'SYSTEM'에는 네트워크 리소스에 액세스 할 수있는 권한이 없다는 것을 알고있을 것입니다.
이 문제에 대한 두 가지 해결책이있을 수 있습니다.
위에서 지적한대로 드라이브를 영구적으로 매핑합니다.
따를 수있는 방법이 하나 더 있습니다. 'services.msc'를 입력하여 서비스 관리자를 열면 서비스로 이동할 수 있으며 서비스 속성에는 계정을 '시스템'이외의 다른 계정으로 지정할 수있는 로그온 탭이 있습니다. 자신의 로그온 한 사용자 계정 또는 '네트워크 서비스'를 통해 서비스를 시작하십시오. 이 작업을 수행하면 .. 서비스는 네트워크 구성 요소 및 드라이브가 영구적이지 않은 경우에도 액세스 할 수 있습니다. 프로그래밍 방식으로이 작업을 수행하려면 http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx 에서 'CreateService'기능을 살펴보고 'lpServiceStartName'매개 변수를 'NT'로 설정할 수 있습니다 AUTHORITY \ NetworkService '입니다. '네트워크 서비스'에서 서비스를 시작합니다
CreateService () 함수의 servicetype 매개 변수 플래그에 SERVICE_INTERACTIVE_PROCESS를 지정하여 서비스를 대화 형으로 만들 수도 있지만 Vista 및 7에서는이 기능을 지원하지 않으므로 XP까지만 제한됩니다.
솔루션이 도움이 되길 바랍니다. 이것이 도움이되었는지 알려주세요.
"시스템"에서 서비스가 실행되는 사용자를 변경하거나 시스템으로 매핑을 실행하는 은밀한 방법을 찾지 마십시오.
재미있는 점은 "at" 명령 을 사용하여 가능하며 1 분 후에 드라이브 매핑을 예약하면 시스템 계정으로 실행되어 드라이브가 서비스에 표시되도록하는 것입니다.
아직 댓글을 달 수 없지만 (평판 작업 중) @Tech Jerk @ spankmaster79 (좋은 이름 LOL)와 @NMC 문제에 답변하기 위해 계정을 만들었습니다. psexec는 추가 도구없이 작동하며 재부팅 후에도 유지됩니다. " @Larry가 작성한 게시물.
이에 대한 해결책은 로그인 한 계정 내에서 해당 폴더를 찾아 보는 것입니다.
\\servername\share
psexec에서 UNC에 사용한 것과 동일한 자격 증명을 입력하라는 메시지가 표시되도록합니다. 그 후 작동하기 시작합니다. 내 경우에는 서비스가있는 서버가 내가 매핑하는 서버와 동일한 도메인의 구성원이 아니기 때문이라고 생각합니다. UNC와 예약 된 작업이 모두 호스트 이름 대신 IP를 참조하는지 생각합니다.
\\123.456.789.012\share
문제를 완전히 피할 수 있습니다.
여기에 충분한 담당자가 표시되면 이것을 대신 회신으로 추가합니다.