Executar um ficheiro batch como Administrador sem mudar a pasta de trabalho…

Published Tue, Apr 7 2009 14:53 | Alberto Silva

No meu PC com Windows Vista e o UAC ligado, ao instalar uma actualização de uns controlos da Resco, executando o ficheiro .bat fornecido, obtinha a mensagem ‘Access Denied’ por cada ficheiro que o ficheiro batch tentava copiar para uma subpasta abaixo da pasta C:\Program Files. Este é o ficheiro:

@ECHO OFF

REM This script copies the libraries to default folders.
REM Change the paths in case the programs are installed in non-default folders.

REM Compact Framework libraries:

SET MFT2008=%programfiles%\Resco MobileForms Toolkit 2009\NET35
SET PRODUCT=AdvancedList

copy .\Full\CF\Resco.%PRODUCT%.CF3.dll "%MFT2008%\CF\Resco.%PRODUCT%.CF3.dll"
copy .\Full\CF\Resco.%PRODUCT%.CF3.XML "%MFT2008%\CF\Resco.%PRODUCT%.CF3.XML"

copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.PocketPC.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.PocketPC.asmmeta.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.WindowsCE.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.WindowsCE.asmmeta.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.Smartphone.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.Smartphone.asmmeta.dll"

copy .\Full\Desktop\Resco.%PRODUCT%.dll "%MFT2008%\Desktop\Resco.%PRODUCT%.dll"
copy .\Full\Desktop\Resco.%PRODUCT%.XML "%MFT2008%\Desktop\Resco.%PRODUCT%.XML"

copy .\Full\Desktop\%PRODUCT%Designer.exe "%MFT2008%\Desktop\%PRODUCT%Designer.exe"

rem "%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /i "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll" /f

PAUSE

Fácil, pensei eu, basta correr isto como administrador e resolve-se o problema.

Ao fazê-lo, cada uma daquelas mensagens ‘Access Denied’ transformou-se em ‘File not found’… humpf… verifiquei o ficheiro .bat, fiz umas modificações, mas o problema persistia e não havia razão para os ficheiros não serem encontrados. Aí lembrei-me de acrescentar um simples ‘dir’ ao início do ficheiro batch e ao corrê-lo normalmente devolveu-me o conteúdo da pasta de onde eu chamava o ficheiro, mas ao corrê-lo como administrador, o dir devolveu-me o conteúdo da pasa C:\Windows\System32!!! Aqc… (tradução livre do inglês wtf…)

Experimentei o RunAs entre outras coisas, sempre sem sucesso, até que me lembrei que não devia ser a primeira alma a encontrar este problema e uma pesquisa na internet devolveu-me esta preciosa página…

http://www.vistax64.com/vista-security/79008-elevate-without-losing-working-directory.html

…após o que alterando o ficheiro inicial para este novo (alterações destacadas), passei a poder executá-lo como administrador, mantendo como ‘working folder’ a pasta de onde o ficheiro batch é chamado:

@ECHO OFF

REM This script copies the libraries to default folders.
REM Change the paths in case the programs are installed in non-default folders.

REM Compact Framework libraries:

SET MFT2008=%programfiles%\Resco MobileForms Toolkit 2009\NET35
SET PRODUCT=AdvancedList

setlocal enableextensions
cd /d "%~dp0"

copy .\Full\CF\Resco.%PRODUCT%.CF3.dll "%MFT2008%\CF\Resco.%PRODUCT%.CF3.dll"
copy .\Full\CF\Resco.%PRODUCT%.CF3.XML "%MFT2008%\CF\Resco.%PRODUCT%.CF3.XML"

copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.PocketPC.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.PocketPC.asmmeta.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.WindowsCE.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.WindowsCE.asmmeta.dll"
copy .\Full\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.Smartphone.asmmeta.dll "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.CF3.Smartphone.asmmeta.dll"

copy .\Full\Desktop\Resco.%PRODUCT%.dll "%MFT2008%\Desktop\Resco.%PRODUCT%.dll"
copy .\Full\Desktop\Resco.%PRODUCT%.XML "%MFT2008%\Desktop\Resco.%PRODUCT%.XML"

copy .\Full\Desktop\%PRODUCT%Designer.exe "%MFT2008%\Desktop\%PRODUCT%Designer.exe"

rem "%ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /i "%MFT2008%\CF\DesignerMetadata\Resco.%PRODUCT%.Design.dll" /f

PAUSE

Mais um stress resolvido… NEXT!!!

[Corrigdo em 8/Abril conforme comentários abaixo]

Filed under:

Comments

# Pedro Lamas said on April 8, 2009 8:39 AM:

Alberto, eu até estou com uma gripe considerável, mas se os meus olhos não me enganam, as linhas que destacaste no segundo bloco, encontram-se também no primeiro... :)

# Alberto Silva said on April 8, 2009 10:26 AM:

LOL!

Copiei a solução para os 2 locais e esqueci-me de remover as linhas para o batch inicial ficar como o original :)

Obrigado pelo reparo, vou corrigir, e entretanto votos de melhoras para essa gripe!

Leave a Comment

Name:  
Website:
If you can't read this number refresh your screen
Enter the numbers above:  

Search

This Blog

Tags

Community

Archives

News

  • Você escolheu um software de gestão que se adapta ao seu negócio... Porque há-de deixar que lhe imponham uma solução de mobilidade para as suas forças de venda? Contacte a moving2u e teremos todo o prazer em lhe apresentar as nossas soluções!


    Grab this badge here!

Eventos

Desenvolvimento .net CF

Mobilidade em Português...

Sobre mim...

Syndication

Email Notifications