Registro e vba



  • Registro e vba
    di Blackadder (utente non iscritto) data: 02/03/2016 16:51:09

    Ciao a tutti,

    Ho il seguente problema con una macro in Excel 2010, la quale dovrebbe modificare il valore di una chiave di cui viene preso in input il percorso.

    La macro, che è riportata sotto, è stata testata su due pc che girano con SO Win 10 Pro, con Excel 2010 e non appartengono a nessun dominio (di default WORKGROUP) e funziona al 100% in modo corretto modificando correttamente qualsiasi chiave di registro di tipo "DWORD", che siano esse chiavi primarie o subchiavi.

    Quando questa stessa macro viene eseguita su un pc in un dominio (dove vi è la necessita che sia eseguita realmente) riscontro 2 problemi che fanno si che la macro non faccia il suo dovere.

    1)Se la chaive è una sub chiave e quindi il percorso per esempio è: HKLMSOFTWAREAGEIA TechnologiesPhysX_A64_Engines2.8.3, la macro restituisce il messaggio "chiave non trovata".

    2)Se la chiave invece si trova in una cartella principale tipo HKLMSOFTWAREAGEIA TechnologiesPhysX Version, la macro trova la chiave e chiede se si vuole modificare il valore. Una volta modificato il valore tramite macro però, se si va a vedere da regedit, il valore non risulta essere variato.

    Come già detto, la macro e il codice risultano corretti e funzionanti poichè su pc fuori dal dominio funzionano perfettamente.

    Mi viene da pensare che sia un problema di credenziali di accesso ai registri.....

    Sui pc non di dominio l'account è amministratore ed excel viene eseguito come amministratore e tutto funziona.
    Sul pc del dominio, l'account è amministratore di dominio ed excel viene eseguito come amministratore, ma non funziona nulla

    Sapete dirmi come settare le autorizzazioni di accesso ai registri in modo tale che anche sul pc di dominio la macro venga eseguita correttamente?

    Grazie!

    Black.
     
    Private Sub CommandButton1_Click()
    
    Call TestRegistry
    
    
    
    End Sub
    
    
    
    Sub TestRegistry()
    Dim myRegKey As String
    Dim myValue As String
    Dim myAnswer As Integer
    
      'input chiave di registro da modificare
      myRegKey = InputBox("Inserisci percorso chiave", _
                 "Get Registry Key")
               x = msgbox("Il percorso è""" & _
                   myRegKey & """" & vbCr, vbOK)
                   
        If x = vbOK Then
        
        
      If myRegKey = "" Then Exit Sub
      'check se esiste
      If RegKeyExists(myRegKey) = True Then
        'se esiste la legge
        myValue = RegKeyRead(myRegKey)
        'mostra il valore e chiede se lo si vuole cambiare
        myAnswer = msgbox("Il valore per la chiave """ & _
                   myRegKey & """" & vbCr & " è """ & myValue & _
                   """" & vbCr & vbCr & _
                   "Vuoi cambiarlo?", vbYesNo)
      Else
        'se non viene trovata da errore
        myAnswer = msgbox("La chiave nel percorso """ & myRegKey & _
                   """ non è stata trovata.")
      End If
      
      If myAnswer = vbYes Then
        'ask for new registry key value
        myValue = InputBox("Inserisci il nuovo valore:", _
                  myRegKey, myValue)
        If myValue <> "" Then
          'save/create registry key with new value
          RegKeySave myRegKey, myValue
          msgbox "Valore modificato."
        End If
      End If
      Else: Exit Sub
      End If
    End Sub
    
    
    'legge il valore della chiave
    'se la chiave non viene trovata il valore è ""
    Function RegKeyRead(i_RegKey As String) As String
    Dim myWS As Object
    
      On Error Resume Next
      'accesso a Windows scripting
      Set myWS = CreateObject("WScript.Shell")
      'legge la chiave dal registro
      RegKeyRead = myWS.RegRead(i_RegKey)
    End Function
    
    
    
    'restituisce True se la chiave di registro i_RegKey è stata trovata
    'sennò falso False
    Function RegKeyExists(i_RegKey As String) As Boolean
    Dim myWS As Object
    
      On Error GoTo ErrorHandler
      'accesso Windows scripting
      Set myWS = CreateObject("WScript.Shell")
      'prova a leggere la chiave di registro
      myWS.RegRead i_RegKey
      'se chiave trovata
      RegKeyExists = True
      Exit Function
      
    ErrorHandler:
      'se chaive non trovata
      RegKeyExists = False
    End Function
    
    
    
    'imposta la chiave di registro i_RegKey
    'al valore i_Value con il tipo i_Type
    'se i_Type non è specificato, il tipo string
    'se i_RegKey non è stata trovata, una nuova chiave di registro viene creata
    Sub RegKeySave(i_RegKey As String, _
                   i_Value As String, _
          Optional i_Type As String = "REG_DWORD")
    Dim myWS As Object
      'accesso a Windows scripting
      Set myWS = CreateObject("WScript.Shell")
      'scrittura della chiave di registro
      myWS.RegWrite i_RegKey, i_Value, i_Type
    
    End Sub