2012-01-12 13 views
4

comme provenant d'un monde * nix Je suis très confus avec le comportement de Windows et probablement son système de sécurité. J'essaie simplement d'exécuter un programme externe dans mon application. J'ai trouvé la fonction WinAPI ShellExecute qui fonctionne comme prévu sauf lors du lancement de certains programmes placés dans le sous-répertoire% windir% \ System32.Pourquoi ShellExecute ne trouve pas de fichier?

  • exécution de ping.exe succède

    ShellExecute(NULL, "open", "c:\\Windows\\System32\\ping.exe', NULL, NULL, SW_SHOW)); 
    // ^^^ OK, retcode == 42 
    
  • exécution de java.exe ne

    ShellExecute(NULL, "open", "c:\\Windows\\System32\\java.exe', NULL, NULL, SW_SHOW)); 
    // ^^^ ERROR_FILE_NOT_FOUND, retcode == 2 
    

Il est très étrange parce que java.exe existe dans System32 , possède des autorisations de lecture/exécution pour le groupe Utilisateurs et peut être appelée à partir de cmd.

C:\>dir /q c:\Windows\System32\java.exe 
Volume in drive C has no label. 
Volume Serial Number is 56E3-0868 

Directory of c:\Windows\System32 

11.01.2012 23:40   172 320 NT AUTHORITY\SYSTEM java.exe 
       1 File(s)  172 320 bytes 
       0 Dir(s) 226 127 564 800 bytes free 

C:\>cacls c:\Windows\System32\java.exe 
c:\Windows\System32\java.exe NT AUTHORITY\SYSTEM:F 
          BUILTIN\Administrators:F 
          BUILTIN\Users:R 

Que manque-t-il ici?

OS est l'édition Windows 7 Édition familiale.

Mise à jour: Si je copie c: \ Windows \ Sytem32 \ calc.exe à c: \ Windows \ Sytem32 \ calc2.exe, ShellExecute peut fonctionner calc.exe d'origine, mais échoue avec calc2.exe bien que les fichiers sont identique !! La seule différence réside dans les autorisations supplémentaires pour le groupe TrustedInstaller, que calc2.exe et java.exe manquent. Une coïncidence ?

+2

Peut-être une question de dépendances? Peut-être que Java dépend d'une DLL qui n'est pas dans le chemin de recherche? – ugoren

+0

Non, java.exe n'est même pas lancé. C'est la valeur de retour ShellExecute de 2 qui signale que l'exécutable n'a pas été trouvé. –

+0

Que se passe-t-il lorsque vous lancez c: \ Windows \ System32 \ java.exe' à partir de la ligne de commande (en utilisant le même utilisateur/environnement que 'ShellExecute')? – NPE

Répondre

10

Exécutez-vous un système d'exploitation 64 bits?

Si tel est le cas, C:\Windows\System32 contiendra des binaires de 64 bits alors que C:\Windows\SysWOW64 contiendra des binaires de 32 bits (oui, c'est exactement comme ça). Pour des raisons de compatibilité ascendante, lors de l'exécution de processus 32 bits, Windows redirige l'accès à C:\Windows\System32 vers C:\Windows\SysWOW64. Donc, si vous utilisez un processus 32 bits pour regarder C:\Windows\System32, vous voyez ce qu'il y a dans C:\Windows\SysWOW64.

Vous pouvez appeler la fonction Wow64DisableWow64FsRedirection pour désactiver ce comportement. Prenez note de l'avertissement dans la documentation et d'examiner attentivement si elle s'applique à votre cas:

Note: La fonction Wow64DisableWow64FsRedirection affecte toutes les opérations de fichiers effectuées par le thread courant, ce qui peut avoir des conséquences imprévues si la redirection du système de fichiers est désactivé pour une durée quelconque.Par exemple, le chargement des DLL dépend de la redirection du système de fichiers. La désactivation de la redirection du système de fichiers entraînera l'échec du chargement des DLL. En outre, de nombreuses implémentations de fonctionnalités utilisent un chargement différé et échouent lorsque la redirection est désactivée. L'état de défaillance de l'opération initiale de chargement différé est conservé, de sorte que toute utilisation ultérieure de la fonction de chargement différé échoue même après que la redirection du système de fichiers a été réactivée. Pour éviter ces problèmes, désactivez la redirection du système de fichiers immédiatement avant les appels à des fonctions d'E/S de fichiers spécifiques (telles que CreateFile) qui ne doivent pas être redirigées et réactivez immédiatement la redirection du système de fichiers à l'aide de Wow64RevertWow64FsRedirection.

+0

* uck! C'est la bonne réponse. Juste curieux de savoir ce que le programmeur peut faire pour exécuter des applications externes à partir de System32 si Windows ignore et remplace même les spécifications de chemin complet? Cette idée fausse est intégrée dans le système en raison de certains anciens programmes de dysfonctionnement? * uck, * uck :( –

+0

Oui, vous pourriez vouloir mentionner Wow64DisableWow64FsRedirection() –

+3

Oui, c'est parce que les programmeurs dans les chemins codés en dur passé. * indice, indice * –

1

Utilisez ProcessMonitor pour savoir quels fichiers sont en cours d'accès et quelle opération de fichier échoue et pourquoi.

0

Vérifiez les paramètres d'environnement, par ex. "CHEMIN". Windows conserve un environnement distinct pour le système et pour les utilisateurs. Il se peut que les DLL requises par Java.exe ne soient répertoriées que dans un seul environnement et que lorsque vous l'exécutez via ShellExecute, il utilise l'autre environnement.

+0

Il ne s'agit probablement pas de paramètres d'environnement. Veuillez consulter la mise à jour de la question pour essayer d'exécuter des fichiers identiques de MS Calc. –

Questions connexes