Executar um ficheiro batch como Administrador sem mudar a pasta de trabalho…
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]