2012-05-17 27 views
8

He estado intentando descifrar este problema, y ​​parece que no puedo encontrar la solución al problema en ninguna parte. Aquí estaba la primera parte: VBA Shell command always returns "File Not Found" En esa pregunta, no encontraba la aplicación en la carpeta% APPDATA% por alguna razón extraña, probablemente una configuración de seguridad.VBA: Cómo ejecutar otra aplicación desde MS Access

Desde entonces, he movido la herramienta de importación al mismo directorio en el que guardo la base de datos, con la pequeña esperanza de que funcione correctamente.

Mi objetivo es hacer clic en un botón en MS Access y hacer que ejecute mi herramienta de importación directamente. En este momento, lo tengo abriendo la carpeta que contiene la herramienta. Esto funciona en mi máquina de desarrollo que tiene privilegios de administrador, pero no funciona en otras máquinas sin privilegios de administrador. El código en este momento se ve algo como lo siguiente:

Dim hProcess as Long 
Dim myPath as String 
Dim ex as String 

ex = "C:\WINDOWS\explorer.exe " 
myPath = Environ("ProgramFiles(x86)") & "\mytool\" 

hProcess = Shell(ex & myPath, vbNormalFocus) 

Esto permite que la carpeta que contiene el archivo que se abrirá, pero sólo en las cuentas de máquina que tienen privilegios de administrador. Al ejecutar esto en una cuenta de máquina que tiene menos de privilegios completos, simplemente no hace nada.

También he intentado el siguiente:

Dim hProcess As Long 
Dim myPath as String 

myPath = Environ("ProgramFiles(x86)") & "\mytool\mytool.exe" 
hProcess = Shell(myPath, vbNormalFocus) 

En esta sección se "parece" a trabajar en que se cargue la aplicación "mytool.exe" cuando miro el gestor de procesos. Sin embargo, después de unos segundos (quizás 20), aparece un cuadro de diálogo que indica que la aplicación "mytool.exe" ha dejado de funcionar.

Una cosa a tener en cuenta aquí es que tengo privilegios de administrador en mi máquina de desarrollo, pero tengo todos los privilegios en mi máquina doméstica. En mi máquina doméstica, este segundo código funciona sin problemas. En mi máquina de desarrollo, se bloquea, mientras que en una máquina de usuario restringido, no hace nada en absoluto.

¿Hay alguna sugerencia sobre cómo abrir esta aplicación desde MS Access utilizando privilegios que no sean de administrador? Ya sea para ejecutar la aplicación directamente o, al menos, para abrir la carpeta en la que reside dicha aplicación.

Gracias!

P.S. He intentado con el código ShellAndWait y RunApplication que se encuentra en stackoverflow, ninguno de los cuales funciona en esta instancia.

Respuesta

1

Sólo jugando con http://www.mombu.com/microsoft/scripting-wsh/t-vista-uac-problem-with-wscriptshell-run-method-1508617.html. Intenté esto en la PC de Windows 7 para el hogar.

Set objShell = CreateObject("Shell.Application") 
myPath = Environ("ProgramFiles(x86)") & "\mytool" 
Set objFolder = objShell.Namespace(myPath) 
Set objFolderItem = objFolder.ParseName("mytool.exe") 
objFolderItem.InvokeVerb "runas" 

Podría darle algunas ideas.

+0

¿Este trabajo con VBA? Sé que muchas instrucciones de VB en el conjunto no tienen contrapartes en VBA. –

+0

Lo probé en VBA, pero no tengo idea si funcionará en su situación. Todo lo que puedo decir es que se ejecutó en VBA en la PC de mi casa. – Fionnuala

+0

Aparece un error de "Método o Datamember no encontrado" en el método objShell.Namespace(). Además, no sé qué dimensionar objFolder y objFolderItem como. Actualmente, están dimensionados como Variant. –

0

Comprobar

Shell szFileName, vbNormalFocus 

con algún otro ejecutable. Puede ser un problema con su herramienta.

3

Siempre utilizo ShellExecute desde Windows API cuando necesito ejecutar algo en VBA.
Por lo que yo sé, funciona en máquinas sin privilegios completos también.

Ejemplo:

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _ 
    ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ 
    ByVal lpDirectory As String, ByVal lpnShowCmd As Long) As Long 


Public Sub ShellEx(ByVal Path As String, Optional ByVal Parameters As String, Optional ByVal HideWindow As Boolean) 

    If Dir(Path) > "" Then 
     ShellExecute 0, "open", Path, Parameters, "", IIf(HideWindow, 0, 1) 
    End If 

End Sub 

Ahora se puede llamar ShellEx para ejecutar casi cualquier cosa:

'run executable 
ShellEx "c:\mytool.exe" 

'open file with default app 
ShellEx "c:\someimage.jpg" 

'open explorer window 
ShellEx "c:\" 

Tenga en cuenta que ShellEx tiene dos parámetros opcionales también.
I, no mostró esto en los ejemplos anteriores, pero se puede:

  • pasar parámetros a los ejecutables
  • ocultar la ventana de la llamada ejecutable