none
Windows 8 : copier un fichier dans System32

    Question

  • Bonjour,

    La copie par FileCopy d'un fichier dans System32 est impossible car le propriétaire est TrustedInstaller.

    Il est donc nécessaire de changer le Propriétaire, par exemple en Administrateurs et de lui donner les droits.

    Jusqu'à présent j'utilisais SetACL. Le code est exécuté sans erreur (en tant qu'administrateur) mais le propriétaire n'est pas modifié.

    Il semble que cette méthode ne soit plus applicable avec Windows 8.

    Connaissez-vous une solution simple, testée sur Windows 8 ?

    Merci


    Cordialement
    Aski - MVP Windows Expert-Consumer
    Forum_Aski

    jeudi 21 février 2013 15:25

Réponses

  • Ta réponse à ma question étant tintinesque, voire dupondeste, peut être que ces API pourraient aider :

    En VB6 :

    Option Explicit
    
    Private Declare Function Wow64DisableWow64FsRedirection Lib "Kernel32" (ByRef OldValue As Long) As Long
    Private Declare Function Wow64RevertWow64FsRedirection Lib "Kernel32" (OldValue As Long) As Long
    
    Dim Wow64Redir As Long
    
    Private Sub Command2_Click()
      Dim lResult As Long
      
      lResult = Wow64DisableWow64FsRedirection(Wow64Redir)
      FileCopy "C:\VB6W8\msidcrl30.dll", "C:\Windows\System32\msidcrl30.dll"
      lResult = Wow64RevertWow64FsRedirection(Wow64Redir)
    End Sub
    
    Sous W8 64 bits cela copie bien la dll sous System32


    Cordialement, Jacques

    • Marqué comme réponse Aski. _MVP vendredi 22 février 2013 18:38
    vendredi 22 février 2013 18:07

Toutes les réponses

  • Bonjour Aski,

    Je ne comprends pas vraiment, j'ai essayé ce code :

    Private Sub Command1_Click() On Error Resume Next Err.Clear FileCopy "C:\VB6W8\_AAA.txt", "C:\Windows\System32\_AAA.txt" If Err.Number > 0 Then MsgBox "Erreur : " & Err.Number & vbCrLf & Err.Description Else MsgBox "Fichier copié" End If End Sub

    et j' obtiens bien le message fichier copié, mais depuis Vista le fichier est copié dans le Virtual File Store

    Je dois avoir la doc Word correspondante quelque part (les liens MSDN sont en partie morts) ...

    Donc pour W8-32 : C:\Users\Jacques\AppData\Local\VirtualStore\Windows\System32

    et W8-64              : C:\Users\Jacques\AppData\Local\VirtualStore\Windows\SysWOW64

    Rencontres tu une erreur lors de la copie, ou ensuite, pour utiliser le fichier par exemple ? Es tu sous 32 ou 64 bits ? Normalement le Virtual Store doit être transparent ( fichiers, registre).

    NB : essai effectué avec le .exe (IDE VB6 non installé, UAC désactivé)


    Cordialement, Jacques

    vendredi 22 février 2013 11:48
  • Je n'ai pas retrouvé de lien MS valide concernant la doc citée dans mon précédent message. Je l'ai déposé ici : WindowsVistaUACDevReqs

    Le chapitre 'Virtualisation' commence page 18


    Cordialement, Jacques

    vendredi 22 février 2013 13:50
  • Bonjour Jacques,

    Merci de répondre car je ne comprends pas

    Je viens de tester par ce code

    Private Sub Form_Load()
      If FileExists("M:\Docs\Vb 6\WMCopy\system32\msidcrl30.dll") Then
        MsgBox "La source existe"
      Else: GoTo Fin
      End If
      If FileExists("c:\windows\system32\msidcrl30.dll") Then
        MsgBox "Copie déjà faite": GoTo Fin
      Else
        If TestCopy Then MsgBox "Réussi"
      End If
      
    Fin:
      Unload Me
    End Sub
    
    Public Function FileExists(NomF As String) As Boolean
      On Error GoTo test
      
      FileExists = True ': DateFile = FileDateTime(File)
      If FileLen(NomF) > 0 Then Exit Function
    
    test:
      FileExists = False
      MsgBox Error
    End Function
    
    Private Function TestCopy() As Boolean
      On Error GoTo FError
      TestCopy = False
      FileCopy "M:\Docs\Vb 6\WMCopy\system32\msidcrl30.dll", "c:\windows\system32\msidcrl30.dll"
      If FileExists("c:\windows\system32\msidcrl30.dll") Then
        MsgBox "La copie a réussi"
        TestCopy = True
      End If
      Exit Function
    FError:
     MsgBox Error, "Raté"
     Unload Me
    End Function

    Le programme répond que le fichier existe alors qu'il n'existe pas.
    Il n'y a pas dans system32 dans Virtual Store et il n'y a qu'un fichier .oca sous syswow64.

    J'ai cherché avec Explorer et avec Total Commander.

    J'ai fait le test Pro 64 bits. sous l'IDE et en mode compilé (en tant qu'administrateur).
    Mon OS est W8 Pro 64 bits. L'UAC est désactivée.

    Le fichier est present sous

    • Program Files\Windows Mail
    • Program Files (86)\Windows Mail (mais ce n'est pas le même)
    • Windows\syswow64 (mais ce n'est pas le même) car j'ai réussi à l'y copier

    Je n'ai pas testé le programme utilisant le fichier. 

    • Modifié Aski. _MVP vendredi 22 février 2013 14:26 ajout
    vendredi 22 février 2013 14:13
  • Pour ce qui concerne la virtualisation, c'est à oublier pour ce cas : les .dll, .exe, .sys ne sont pas concernés :

    Virtualization Reference

    File virtualization

    • Virtualize (%SYSTEMROOT%, %PROGRAMDATA%, %PROGRAMFILES%\(Subdirectories)
    • Redirect to: %LOCALAPPDATA%\VirtualStore
    • Excluded binary executables: .exe, .dll, .sys

    (page 82 de la doc).

    J'ai pu copier msidcrl30.dll dans C:\Windows\System32 (je suis dans une VM W8 Pro 32) en lançant le .exe en tant qu'administrateur, sinon erreur 75 : Erreur dans le chemin d'accès. Je vérifie sous W8 Pro 64, faut que je reboote ...

    C'est fait, OK aussi sous W8 Pro 64, copié dans C:\Windows\SysWoW64, à condition d’exécuter en tant qu'administrateur.


    Cordialement, Jacques


    • Modifié Jacques93 vendredi 22 février 2013 16:35 Test W8 Pro 64
    vendredi 22 février 2013 16:13
  • La DLL 64 bits sous 64 bits doit être copiée sous System32.

    C'est celle-ci qui me donne des problèmes et que mon code signale comme présente alors que je ne la trouve pas.

    Je ne peux la supprimer pour recommencer puisque je ne la trouve pas :o(

    Comment
    If FileLen(NomF) > 0
    peut-il retourner True ?


    Cordialement
    Aski - MVP Windows Expert-Consumer
    Forum_Aski


    • Modifié Aski. _MVP vendredi 22 février 2013 17:18
    vendredi 22 février 2013 17:17
  • Peut on résumer la question à : comment à partir d'une application 32 bits (VB6) copier une dll 64 bits dans System32 et non SysWow64 ?

    Normalement FileLen(NomF) > 0 ne peut retourner True que si NomF existe et a une taille > 0. Je sais,on tourne en rond ...


    Cordialement, Jacques

    vendredi 22 février 2013 17:36
  • Je dirais plutôt "comment à partir d'une application 32 bits (VB6) copier une dll 64 bits dans System32".

    Je viens de supprimer le premier test de longueur pour forcer la copie et FileLen > 0 retourne toujours Vrai (le fichier n'est toujours pas copié).

    Je vais lancer demain le même test sur un autre PC avec W8 64 bits neuf.
    Sur le PC actuel j'ai désactivé l'UAC (on ne sait jamais). Les résultats sont les mêmes.

    J'espérais avoir fait la méga c... dans mon code (l'âge n'arrangeant pas les choses).

    Nota : Sans compte administrateur l'exe de test retourne l'erreur 13 (type incompatible).


    Cordialement
    Aski - MVP Windows Expert-Consumer
    Forum_Aski

    vendredi 22 février 2013 17:58
  • Ta réponse à ma question étant tintinesque, voire dupondeste, peut être que ces API pourraient aider :

    En VB6 :

    Option Explicit
    
    Private Declare Function Wow64DisableWow64FsRedirection Lib "Kernel32" (ByRef OldValue As Long) As Long
    Private Declare Function Wow64RevertWow64FsRedirection Lib "Kernel32" (OldValue As Long) As Long
    
    Dim Wow64Redir As Long
    
    Private Sub Command2_Click()
      Dim lResult As Long
      
      lResult = Wow64DisableWow64FsRedirection(Wow64Redir)
      FileCopy "C:\VB6W8\msidcrl30.dll", "C:\Windows\System32\msidcrl30.dll"
      lResult = Wow64RevertWow64FsRedirection(Wow64Redir)
    End Sub
    
    Sous W8 64 bits cela copie bien la dll sous System32


    Cordialement, Jacques

    • Marqué comme réponse Aski. _MVP vendredi 22 février 2013 18:38
    vendredi 22 février 2013 18:07
  • Bonjour Jacques,

    Chapeau. Je dirais même plus, chapeau bas.

    Le fonctionnement est parfait même depuis l'IDE.

    Où devrais-je trouver la DLL redirigée, sans appliquer l'API ? > sous sysWOW64 !

    Devrait-on appliquer les 2 API dans tous les cas (pour 64 bits) ? oui, au moins pour les manips dans les dossiers système.

    Edit : J'ai (enfin) compris le sens de ta phrase

    "comment à partir d'une application 32 bits (VB6) copier une dll 64 bits dans System32 et non SysWow64 "

    en vérifiant la longueur du fichier contenu dans sysWOW64.

    C'est un sacré piège.


    Cordialement
    Aski - MVP Windows Expert-Consumer
    Forum_Aski



    • Modifié Aski. _MVP vendredi 22 février 2013 18:52
    vendredi 22 février 2013 18:44
  • Bonjour Henri,

    C'est un peu le hasard : il y a deux semaines, sur le forum VB.Net il y a eu une question concernant la clavier visuel (osk.exe). Équivalent de

        Shell "osk.exe"

    en VB6. Ben ça marche pas, le programme (32 bits) lance le osk.exe 32 bits (de SysWow64), qui ne tourne pas sous un OS 64 bits. Et c'est à cette occasion que j'ai fait la connaissance de ces API.

    Elles sont disponibles pour les OS ayant une version 64 bits : Vista, W7, W8. Pour XP, à priori Ok sous XP64 (pas testé, j'ai pas), mais absentes de XP 32 bits, ce qui implique un éventuel test de la plate-forme.

    Mais comme il semble que pour toi il s'agit de permettre l'installation de Windows Mail sous W8, cet aspect ne devrait pas être gênant.


    Cordialement, Jacques

    samedi 23 février 2013 12:54
  • Bonjour Jacques,

    Je pense que mes soucis relatifs aux changements de propriétaires et aux prises de droit sur system32 ont la même origine.

    Par contre, les commandes classiques
    takeown /a /f "%windir%\system32" /r
    cacls "%windir%\system32" /t /e /g administrateurs:f
    Références
    http://technet.microsoft.com/en-us/library/cc753024(WS.10).aspx
    http://technet.microsoft.com/en-us/library/bb490872.aspx
    semblent ne présenter aucun problème d'après mes tests.


    Cordialement
    Aski - MVP Windows Expert-Consumer
    Forum_Aski

    samedi 23 février 2013 14:14