como testar como conta SYSTEM local? (acessando arquivos remotos do Python)

1

Estou tentando acessar alguns arquivos remotos de um servidor de aplicativos da web. Vamos chamá-los de servidores M e R. Ambos estão executando o Windows Server (2008 e 2003).

Os arquivos remotos estão no servidor R em um compartilhamento de arquivos legível por Todos (permissões de compartilhamento e permissões de segurança permitem que Everyone seja lido). Este compartilhamento é chamado \R\EthRelease .

O aplicativo da Web está no servidor M . Estou executando um script Python (realmente Jython) no contêiner do servlet Tomcat (via BSF ) para tentar para acessar os arquivos remotos em R .

Mas não importa o que eu faça, o script não pode ver a pasta compartilhada remota. Por exemplo, Eu uso o código Python como:

# 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)))

e as únicas pastas que o script diz que existem são C:\ e 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"/>

Por outro lado, quando eu faço um dir em qualquer um dos caminhos acima no prompt do CMD no servidor M, eles existem e são legíveis:

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>

Eu tentei isso com o Jython stable 2.5.3 e com o Jython beta 2.7b1, e obtive os mesmos resultados. Eu sei que não é apenas um problema do Python, porque eu executo comandos semelhantes no meu laptop (usando o Python 3.3) e consigo acessar o mesmo compartilhamento de rede com êxito.

Uma possível diferença é que o contêiner do servlet, Tomcat, está sendo executado como o usuário SYSTEM local no servidor M, enquanto no shell CMD eu estou conectado como outro usuário. Mas, como mencionado anteriormente, Everyone tem acesso ao compartilhamento de arquivos remoto, então isso não deve fazer diferença, certo? Existe alguma maneira que eu possa fazer o login como o usuário do sistema e testar se eu sou capaz de acessar o compartilhamento de arquivos remoto nesse estado?

Outra possível diferença é que o contêiner de servlet ou BSF pode impor algum tipo de restrição de área restrita, impedindo que eu acesse arquivos fora do contêiner do servlet. Mas isso não está acontecendo, porque eu posso verificar C:\ .

Alguma ideia? Isso tem me levado até a parede. Eu tentei algumas vezes diferentes anteriormente para acessar os arquivos diretamente de dentro do Cocoon e atingir o mesmo tipo de parede. Recentemente eu pensei 'Eureka! Eu posso terceirizar o problema para um script Python! Python pode lidar com isso! Mas até agora, não há dados.

    
por LarsH 18.12.2013 / 23:05

2 respostas

2

Como discutido nestas perguntas do Superusuário - O prompt de linha de comando elevado não pode acessar unidades compartilhadas no Windows 7 e < a href="https://superuser.com/q/105173/150988"> Como acessar compartilhamentos de rede a partir de um processo elevado no Windows 7? - os mapeamentos de unidade são associados a um login e, portanto, o SYSTEM não faz isso t tê-los a menos que você faça arranjos especiais. Você pode precisar operar nos arquivos remotos pelo UNC ou fazendo um NET USE do seu código. Observe que seu programa de teste informa que possui F e R de acesso a \R\EthRelease .

    
por 18.12.2013 / 23:28
1

Em geral, não uso a conta do sistema local para essa finalidade. Eu olharia para executá-lo na conta do serviço de rede ou em uma conta de serviço gerenciado para fornecer esse acesso.

Se você realmente quiser fazer o login como conta do sistema local para testar isso, existem algumas maneiras de abrir um shell como a conta do sistema local.

Você pode usar o PSEXEC encontrado no PSTools e abra uma sessão cmd interativa na conta do sistema: psexec -i -s cmd.exe

Ou inicie uma tarefa agendada executando como a conta do sistema ( at <time> /interactive cmd.exe )

    
por 18.12.2013 / 23:19