로컬 SYSTEM 계정으로 테스트하는 방법은 무엇입니까? (Python에서 원격 파일에 액세스)

로컬 SYSTEM 계정으로 테스트하는 방법은 무엇입니까? (Python에서 원격 파일에 액세스)

웹 응용 프로그램 서버에서 일부 원격 파일에 액세스하려고 합니다. 이를 서버 M과 R이라고 부르겠습니다. 둘 다 Windows Server(2008 및 2003)를 실행하고 있습니다.

원격 파일은 모든 사람이 읽을 수 있는 파일 공유의 서버 R에 있습니다(공유 권한 및 보안 권한은 Everyone읽기 허용). 이 공유를 이라고 합니다 \\R\EthRelease.

웹 애플리케이션이 서버에 있습니다 M. 저는 Tomcat 서블릿 컨테이너 아래에서 Python(실제로는 Jython) 스크립트를 실행하고 있습니다.BSF)에 있는 원격 파일에 액세스하려고 합니다 R.

하지만 내가 무엇을 하든 대본은원격 공유 폴더를 볼 수 없습니다.예를 들어 다음과 같은 Python 코드를 사용합니다.

# Note, R: is a mapped network drive pointing to \\R\EthRelease
for file in ['C:', 'C:\\', 'C:\\Users', 'R:', 'R:\\',
        r"\\R\EthRelease", r"\\172.x.x.x\EthRelease"]:
    output.append("  <accessCheck dir='%s' exists='%s' accessF='%s' accessR='%s'/>\n" %
        (file, os.path.exists(file), os.access(file, os.F_OK),
        os.access(file, os.R_OK)))

스크립트에 존재한다고 표시된 유일한 폴더는 다음 C:\과 같습니다 C:\Users.

<accessCheck dir="C:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="C:\" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="C:\Users" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="R:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="R:\" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="\\R\EthRelease" exists="False" accessF="True" accessR="True"/>
<accessCheck dir="\\172.x.x.x\EthRelease" exists="False" accessF="False" accessR="False"/>

dir대조적으로, 서버 M의 CMD 프롬프트에서 위 경로 중 하나 를 수행하면 해당 경로가 존재하고 읽을 수 있습니다.

C:\Users\me>dir r:\
 Volume in drive R is GIS
 Volume Serial Number is ...

 Directory of r:\

12/03/2012  09:18 AM    <DIR>          .
12/03/2012  09:18 AM    <DIR>          ..
07/25/2013  08:51 AM    <DIR>          EGI
12/17/2013  05:46 AM    <DIR>          maps
               0 File(s)              0 bytes
               4 Dir(s)  48,192,491,520 bytes free

C:\Users\me>

나는 Jython stable 2.5.3과 Jython beta 2.7b1 모두에서 이것을 시도했고 동일한 결과를 얻었습니다. 내 랩탑에서 (Python 3.3을 사용하여) 유사한 명령을 실행하고 동일한 네트워크 공유에 성공적으로 액세스할 수 있기 때문에 이것이 단지 Python 문제가 아니라는 것을 알고 있습니다.

한 가지 가능한 차이점은 서블릿 컨테이너인 Tomcat이 서버 M에서 로컬 SYSTEM 사용자로 실행되고 있는 반면 CMD 셸에서는 다른 사용자로 로그인되어 있다는 것입니다. 하지만 앞서 언급했듯이 Everyone원격 파일 공유에 액세스할 수 있으므로 별 차이가 없을 것입니다. 그렇죠? SYSTEM 사용자로 로그인하여 해당 상태에서 원격 파일 공유에 액세스할 수 있는지 테스트할 수 있는 방법이 있습니까?

또 다른 가능한 차이점은 서블릿 컨테이너 또는 BSF가 일종의 샌드박싱 제한을 부과하여 서블릿 컨테이너 외부의 파일에 액세스하지 못하게 할 수 있다는 것입니다. 하지만 그런 일은 일어나지 않습니다. 왜냐하면 제가 확인할 수 있기 때문입니다 C:\.

어떤 아이디어?? 이것이 나를 벽으로 몰고 갔다. 이전에 내부에서 직접 파일에 액세스하려고 몇 번 시도했습니다.고치, 그리고 같은 종류의 벽에 부딪혔습니다. 최근에는 '유레카! 문제를 Python 스크립트에 아웃소싱할 수 있습니다! 파이썬은 그것을 처리할 수 있습니다!' 하지만 지금까지는 주사위가 없습니다.

답변1

슈퍼유저 질문에서 논의한 바와 같이 –Windows 7에서는 관리자 권한 명령줄 프롬프트가 공유 드라이브에 액세스할 수 없습니다.그리고Windows 7의 높은 프로세스에서 네트워크 공유에 액세스하는 방법은 무엇입니까?– 드라이브 매핑은 로그인과 연결되어 있으므로 특별한 조치를 취하지 않는 한 SYSTEM에는 해당 매핑이 없습니다. UNC를 사용하거나 NET USE코드에서 작업을 수행하여 원격 파일에 대해 작업해야 할 수도 있습니다 . 테스트 프로그램은 에 대한 액세스 권한이 F있다고 보고합니다 .R\\R\EthRelease

답변2

나는 일반적으로 이 목적으로 로컬 시스템 계정을 사용하지 않을 것입니다. 이 액세스를 제공하기 위해 networkservice 계정이나 관리 서비스 계정에서 실행하는 방법을 살펴보겠습니다.

이를 테스트하기 위해 로컬 시스템 계정으로 로그인하려면 로컬 시스템 계정으로 셸을 여는 몇 가지 방법이 있습니다.

당신이 사용할 수있는PSEXEC에서 발견PSTools시스템 계정으로 대화형 cmd 세션을 엽니다.psexec -i -s cmd.exe

또는 시스템 계정( at <time> /interactive cmd.exe) 으로 실행되는 예약된 작업을 시작하세요.

관련 정보