2017-03-29 1 views
0

Je développe une application déployée throgh ClickOnce et je dois être capable de distinguer chaque installation. Existe-t-il un moyen d'obtenir un identifiant de déploiement qui change pour chaque installation (donc 2 utilisateurs sur le même PC obtiennent 2 identifiants différents) mais reste le même si l'application est mise à jour?Obtenez l'installation de ClickOnce uid

Merci

+0

Je viens de vérifier, où l'entrée de désinstallation est placé dans le registre. Son dans 'HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ [SomeId]' et peut-être vous pouvez l'utiliser. Mais vous devez vérifier par vous-même, je l'ai seulement trouvé là pour le seul clic une fois que j'ai actuellement installé sur mon PC. Je ne sais pas si cela change à la mise à jour et si elle est différente entre les utilisateurs et les PC – grek40

Répondre

0

Après quelques recherches, je n'ai pas pu trouver quoi que ce soit si je fini par créer l'UID moi-même en hachant l'ID CPU, carte mère et les informations GUID utilisateur.

Got un peu d'inspiration d'un CodeProject article et un MSDN Forum question

Public Function SHA256Hash(ByVal s As String) As String 
    Dim hashFunction As SHA256 = SHA256Managed.Create 
    Dim bytes() As Byte = (New ASCIIEncoding).GetBytes(s) 
    Dim hash() As Byte = hashFunction.ComputeHash(bytes) 
    Return GetStringFromHash(hash) 
End Function 

Private _HardwareID As String 
Public Function HardwareID() As String 
    If String.IsNullOrWhiteSpace(_HardwareID) Then 
     _HardwareID = SHA256Hash(String.Format("CPU>>{0}|BASE>>{1}|USER>>{2}", cpuID, baseID, userID)) 
    End If 

    Return _HardwareID 
End Function 

Private Function identifier(ByVal wmiClass As String, ByVal wmiProperty As String) 
    Dim result As String = String.Empty 
    Dim mc As New Management.ManagementClass(wmiClass) 
    Dim moc As Management.ManagementObjectCollection = mc.GetInstances() 

    For Each mo As Management.ManagementObject In moc 
     'Only get the first one 
     If String.IsNullOrWhiteSpace(result) Then 
      Try 
       result = mo(wmiProperty).ToString 
      Catch ex As Exception 
      End Try 
     End If 
    Next 

    Return result 
End Function 

Private Function cpuID() As String 
    'Uses first CPU identifier available in order of preference 
    'Don't get all identifiers, as it is very time consuming 
    Dim retVal As String = identifier("Win32_Processor", "UniqueID") 
    If String.IsNullOrWhiteSpace(retVal) Then 'If no UniqueID, use ProcessorID 
     retVal = identifier("Win32_Processor", "ProcessorId") 
     If String.IsNullOrWhiteSpace(retVal) Then 'If no ProcessorId, use Name 
      retVal = identifier("Win32_Processor", "Name") 
      If String.IsNullOrWhiteSpace(retVal) Then 'If no Name, use Manufacturer 
       retVal = identifier("Win32_Processor", "Manufacturer") 
      End If 
     End If 
    End If 

    Return retVal 
End Function 

Private Function baseID() As String 
    Return String.Concat(identifier("Win32_BaseBoard", "Model"), _ 
         identifier("Win32_BaseBoard", "Manufacturer"), _ 
         identifier("Win32_BaseBoard", "Name"), _ 
         identifier("Win32_BaseBoard", "SerialNumber")) 
End Function 

Private Function userID() As String 
    Return System.DirectoryServices.AccountManagement.UserPrincipal.Current.Guid.Value.ToString 
End Function