programing

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

firstcheck 2023. 5. 13. 21:45
반응형

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

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

이것은 당신의 책임 하에 사용하세요.(XP 및 Server 2008 x64 R2에서 테스트했습니다.)

이 해킹을 위해서는 Sysinternals가 필요합니다.마크 루시노비치의 스위트룸:

1단계: 상승된 cmd.exe 프롬프트 열기(관리자 권한으로 실행)

2단계:PSExec.exe를 사용하여 루트로 다시 상승: Sysinternal이 들어 있는 폴더로 이동합니다.다음 명령을 실행합니다.psexec -i -s cmd.exe " 은신이프트있안다니습에프롬당제▁that"라는 프롬프트 안에 .nt authority\system그리고 당신은 타이핑을 통해 이것을 증명할 수 있습니다.whoami.-i 작용해야 합니다.

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

그렇게 쉬워요!

경고: 이 매핑은 생성한 것과 동일한 방법으로만 시스템 계정에서 제거할 수 있습니다.제거해야 할 경우 1단계와 2단계를 따르되 3단계의 명령을 다음과 같이 변경합니다.net use z: /delete.

참고: 이제 새로 생성된 매핑된 드라이브가 이 시스템의 모든 사용자에게 표시되지만 "Disconnected Network Drive(Z:)"로 표시됩니다.그 이름이 당신을 속이게 하지 마세요.연결이 끊겼다고 주장할 수도 있지만 모두에게 효과가 있습니다.그래야 이 해킹이 M$에 의해 지원되지 않는다는 것을 알 수 있습니다.

저는 psexec과 유사한 솔루션을 찾았지만 추가없이 작동하고 재부팅 후에도 작동합니다.

예약된 작업을 추가하고 "다른 이름으로 실행" 필드에 "시스템"을 삽입한 다음 간단한 명령으로 작업을 배치 파일로 가리킵니다.

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

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

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

도우미 프로세스 접근 방식은 드라이브를 매핑하고 '실제' 서비스를 시작하는 새 서비스를 만드는 것만으로 매우 간단합니다.이것에 대해 완전히 사소한 것이 아닌 유일한 것은 다음과 같습니다.

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

  • 자격 증명 측면에서 상황이 다소 까다로워질 수 있습니다.실제 서비스가 일반 사용자 계정으로 실행되는 경우 해당 계정으로도 도우미 서비스를 실행할 수 있으며, 해당 계정이 네트워크 공유에 대한 적절한 액세스 권한을 가지고 있는 한 모든 것이 정상입니다.실제 서비스가 LOCALSYSTEM 등으로 실행될 때만 작동하는 경우 네트워크 드라이브를 전혀 '인식'할 수 없거나 작동하려면 자격 증명이 필요하기 때문에 상황이 더욱 흥미로워집니다.

더 나은 방법은 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의 제안을 따르겠지만 약간 비틀어 보겠습니다.드라이브를 매핑하는 고유한 서비스(매핑 서비스라고 함)를 만들고 이 매핑 서비스를 첫 번째(실제 작동) 서비스의 종속성에 추가합니다.이렇게 하면 매핑 서비스가 시작되고 드라이브가 매핑되기 전에 작업 서비스가 시작되지 않습니다.

강제 푸시,

참고: 이제 새로 생성된 매핑된 드라이브가 이 시스템의 모든 사용자에게 표시되지만 "Disconnected Network Drive(Z:)"로 표시됩니다.그 이름이 당신을 속이게 하지 마세요.연결이 끊겼다고 주장할 수도 있지만 모두에게 효과가 있습니다.그래서 이 해킹이 M$에 의해 지원되지 않는다는 것을 알 수 있습니다.

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

시작 스크립트에서 드라이브 문자를 매핑하지 않고 사용했습니다.net use \\\server\share ...예약된 작업에 UNC 경로를 사용했습니다. 문자가 스크립트 시작 폴더에 ) :net use Z: \\\...동일한 자격 증명을 사용합니다.이제 로그에 기록된 사용자가 매핑된 드라이브를 보고 액세스할 수 있습니다.동일한 공유에 대한 연결이 2개 있습니다.이 경우 사용자는 성가신 "연결이 끊긴 네트워크 드라이브..."를 보지 못합니다. 하지만 UNC뿐만 아니라 드라이브 문자로 해당 공유에 액세스해야 하는 경우에는 공유하는 다른 드라이브 문자(예: 시스템의 경우 Y, 사용자의 경우 Z)와 매핑하십시오.

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

NFS Disk가 포함된 윈도우즈 서버 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 서비스를 실행하면 로그인 없이 완벽하게 수행됩니다.

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

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

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

  2. 따를 수 있는 접근법이 하나 더 있습니다.'services.msc'를 입력하여 서비스 관리자를 열면 서비스로 이동할 수 있으며, 서비스 속성에는 계정을 'System'이 아닌 다른 계정으로 지정할 수 있는 logOn(로그온) 탭이 있습니다. 이 탭에서는 로그온한 사용자 계정에서 서비스를 시작하거나 'Network Service(네트워크 서비스)'를 통해 서비스를 시작할 수 있습니다.이 작업을 수행할 때...이 서비스는 영구적이지 않더라도 모든 네트워크 구성 요소 및 드라이브에 액세스할 수 있습니다.프로그래밍 방식으로 이를 달성하려면 http://msdn.microsoft.com/en-us/library/ms682450(v=vs.85).aspx 에서 'CreateService' 기능을 살펴보고 매개 변수 'lpServiceStartName'을 'NT AUTHORITY\NetworkService'로 설정할 수 있습니다.그러면 '네트워크 서비스' 계정에서 서비스가 시작되고 완료됩니다.

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

솔루션이 도움이 되길 바랍니다.이것이 당신에게 효과가 있었는지 알려주세요.

매우 간단한 방법을 찾았습니다. PowerShell의 "New-SmbGlobalMapping" 명령을 사용하면 드라이브가 글로벌하게 마운트됩니다.

$User = "usernmae"
$PWord = ConvertTo-SecureString -String "password" -AsPlainText -Force
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $PWord
New-SmbGlobalMapping -RemotePath \\192.168.88.11\shares -Credential $creds -LocalPath S:

서비스가 실행되는 사용자를 "시스템"에서 변경하거나 매핑을 시스템으로 실행하는 교활한 방법을 찾고 싶지 않습니다.

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

@Larry가 올린 게시물 @Larry는 "pexec과 유사하지만 추가 도구 없이 작동하고 재부팅 후에도 살아남는 솔루션을 찾았습니다."에 대한 답변으로 보고된 @Tech Juck @spankmaster79(좋은 이름 lol) 및 @NMC 문제에 답변하기 위해 계정을 만들었습니다.

이에 대한 해결책은 로그인한 계정 내에서 해당 폴더를 찾기만 하면 됩니다.

    \\servername\share  

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

    \\123.456.789.012\share 

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

만약 제가 여기서 충분한 점수를 받는다면, 저는 대신 이것을 답변으로 추가할 것입니다.

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

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

이것은 나에게 효과가 있습니다.

언급URL : https://stackoverflow.com/questions/182750/map-a-network-drive-to-be-used-by-a-service

반응형