Auslesen von Registry Values im ForEach

  • VB.NET
  • .NET 4.5

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Auslesen von Registry Values im ForEach

    Guten Mahlzeit Gemeinde,

    ich bin derzeit auf der Suche nach einem Lösungsansatz für folgendes Problem.

    Ich hab folgenden Registry-Path "Computer\HKEY_CURRENT_USER\Software\Microsoft\Office" - ab diesem Pfad soll gesucht werden ob sich in irgendeinem der Unterschlüssel der Value "IMAP Server" befindet und wenn ja, was in dem Value drin steht. Es handelt sich hier nicht um einen SubKey sondern einen Value (String) innerhalb des Keys.

    So kann es beispielsweise aussehen in der Registry



    Ich stelle mir da einfach ein Console.WriteLine(strCompeletePath & "IMAP Server" & strIMAPServerValue) vor ... habt ihr da einen Lösungsansatz oder denkansatz? Finde "reg query "" "" /s" nicht so geil.

    Danke euch!
    Kann ich aktuell noch nicht ganz nachvollziehen. Ich habe das soweit einmal, mehr oder weniger, kommentarlos übernommen - er findet allerdings keine Werte, obwohl dieser (siehe Bild) da ist. Er soll ja ab "Software\Microsoft\Office" alles nach "IMAP Server" durchsuchen und das Ergebnis dann in einen String schmeißen, mit dem ich dann tolle Dinge anstelle (ausgeben in erster Linie).



    Besten Dank
    Ich haue mal, ganz unkommentiert folgendes Modul raus, das ich mir letztens zusammengeschraubt habe:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Imports System.Security.AccessControl
    3. Imports System.Text
    4. Imports Microsoft.Win32
    5. Module RegistryExtensions
    6. #Region "GetRegistryKeyValue As RegistryKeyValue"
    7. ''' <summary>
    8. ''' Get all data from given RegistryKey.Value (Name, RegistryValueKind, Value).
    9. ''' </summary>
    10. ''' <param name="_baseKey"></param>
    11. ''' <param name="_subKey"></param>
    12. ''' <param name="_valueName"></param>
    13. ''' <param name="_registryView"></param>
    14. ''' <returns>RegistryKeyValue</returns>
    15. <Extension>
    16. Public Function RegistryKeyValue(ByVal _baseKey As RegistryHive,
    17. ByVal _index As Integer,
    18. ByVal _subKey As String,
    19. ByVal _valueName As String,
    20. ByVal Optional _registryView As RegistryView = RegistryView.Default) As RegistryKeyValue
    21. Using key As RegistryKey = RegistryKey.OpenBaseKey(_baseKey, _registryView).OpenSubKey(_subKey)
    22. Return RegistryKeyValue(key, _index, _valueName)
    23. End Using
    24. End Function
    25. ''' <summary>
    26. ''' Get all data from given RegistryKey.Value (Name, RegistryValueKind, Value).
    27. ''' </summary>
    28. ''' <param name="_key"></param>
    29. ''' <param name="_valueName"></param>
    30. ''' <returns>RegistryKeyValue</returns>
    31. <Extension>
    32. Public Function RegistryKeyValue(ByVal _key As RegistryKey,
    33. ByVal _index As Integer,
    34. ByVal _valueName As String) As RegistryKeyValue
    35. Return New RegistryKeyValue(_index,
    36. _valueName,
    37. _key.GetValueKind(_valueName),
    38. _key.GetValue(_valueName, String.Empty))
    39. End Function
    40. #End Region
    41. #Region "GetRegistryKeyValues As List(Of RegistryKeyValue)"
    42. ''' <summary>
    43. ''' Get RegistryKeyValue from all values in a given RegistryKey.
    44. ''' </summary>
    45. ''' <param name="_baseKey"></param>
    46. ''' <param name="_subKey"></param>
    47. ''' <param name="_registryView"></param>
    48. ''' <returns>List of RegistryKeyValue</returns>
    49. <Extension>
    50. Public Function RegistryKeyValues(ByVal _baseKey As RegistryHive,
    51. ByVal _subKey As String,
    52. ByVal Optional _registryView As RegistryView = RegistryView.Default) As List(Of RegistryKeyValue)
    53. Using key As RegistryKey = RegistryKey.OpenBaseKey(_baseKey, _registryView).OpenSubKey(_subKey, False)
    54. Return RegistryKeyValues(key)
    55. End Using
    56. End Function
    57. ''' <summary>
    58. ''' Get RegistryKeyValue from all values in a given RegistryKey.
    59. ''' </summary>
    60. ''' <param name="_key"></param>
    61. ''' <returns>List of RegistryKeyValue</returns>
    62. <Extension>
    63. Public Function RegistryKeyValues(ByVal _key As RegistryKey) As List(Of RegistryKeyValue)
    64. Dim values As New List(Of RegistryKeyValue)
    65. Dim keyValueNames() As String = _key.GetValueNames()
    66. For i As Integer = 0 To keyValueNames.Length - 1
    67. values.Add(RegistryKeyValue(_key, i, _key.GetValueNames(i).ToString))
    68. Next
    69. Return values
    70. End Function
    71. #End Region
    72. <Extension>
    73. Public Sub FullAcces(ByVal _key As RegistryKey, ByVal _user As String)
    74. Dim registrySecurity As New RegistrySecurity()
    75. registrySecurity = _key.GetAccessControl()
    76. registrySecurity.AddAccessRule(New RegistryAccessRule(_user,
    77. RegistryRights.WriteKey Or
    78. RegistryRights.ReadKey Or
    79. RegistryRights.Delete Or
    80. RegistryRights.FullControl,
    81. AccessControlType.Allow))
    82. End Sub
    83. <Extension>
    84. Public Function ValueExist(ByVal _key As RegistryKey, ByVal _valueName As String) As Boolean
    85. Dim ValueNames() As String = _key.GetValueNames()
    86. For Each valueName As String In ValueNames
    87. Dim value As String
    88. If TypeOf _key.GetValue(valueName) Is Byte() Then
    89. Dim encoding As New ASCIIEncoding()
    90. value = encoding.GetString(CType(_key.GetValue(valueName), Byte()))
    91. Else
    92. value = CStr(_key.GetValue(valueName))
    93. End If
    94. If value = _valueName Then Return True
    95. Next
    96. Return False
    97. End Function
    98. Private Class BaseKey
    99. Public Property UserFrendly As String
    100. Public Property Hive As RegistryHive
    101. Public Property Key As RegistryKey
    102. Sub New()
    103. End Sub
    104. End Class
    105. #Region "Misc"
    106. ''' <summary>
    107. ''' Convert user frendly String to a [Enum]RegistryHive.Value.
    108. ''' </summary>
    109. ''' <param name="_string"></param>
    110. ''' <returns>[Enum]RegistryHive.Value</returns>
    111. <Extension>
    112. Public Function ToRegistryHive(ByVal _string As String) As RegistryHive
    113. Select Case _string
    114. Case = "HKEY_CLASSES_ROOT"
    115. Return RegistryHive.ClassesRoot
    116. Case = "HKEY_CURRENT_CONFIG"
    117. Return RegistryHive.CurrentConfig
    118. Case = "HKEY_CURRENT_USER"
    119. Return RegistryHive.CurrentUser
    120. Case = "HKEY_DYNAMIC_DATA" '?
    121. Return RegistryHive.DynData
    122. Case = "HKEY_LOCAL_MACHINE"
    123. Return RegistryHive.LocalMachine
    124. Case = "HKEY_PERFORMANCE_DATA" '?
    125. Return RegistryHive.PerformanceData
    126. Case = "HKEY_USERS"
    127. Return RegistryHive.Users
    128. Case Else
    129. Throw New ArgumentOutOfRangeException
    130. End Select
    131. End Function
    132. ''' <summary>
    133. ''' Convert [Enum]RegistryHive.Value to a user frendly String.
    134. ''' </summary>
    135. ''' <param name="_registryHive"></param>
    136. ''' <returns>User frendly String.</returns>
    137. <Extension>
    138. Public Function ToUserFrendlyString(ByVal _registryHive As RegistryHive) As String
    139. Select Case _registryHive
    140. Case = RegistryHive.ClassesRoot
    141. Return "HKEY_CLASSES_ROOT"
    142. Case = RegistryHive.CurrentConfig
    143. Return "HKEY_CURRENT_CONFIG"
    144. Case = RegistryHive.CurrentUser
    145. Return "HKEY_CURRENT_USER"
    146. Case = RegistryHive.DynData
    147. Return "HKEY_DYNAMIC_DATA" '?
    148. Case = RegistryHive.LocalMachine
    149. Return "HKEY_LOCAL_MACHINE"
    150. Case = RegistryHive.PerformanceData
    151. Return "HKEY_PERFORMANCE_DATA" '?
    152. Case = RegistryHive.Users
    153. Return "HKEY_USERS"
    154. Case Else
    155. Throw New ArgumentOutOfRangeException
    156. End Select
    157. End Function
    158. ''' <summary>
    159. ''' Convert [Enum]RegistryHive.Value to a user frendly String.
    160. ''' </summary>
    161. ''' <param name="_registryHive"></param>
    162. ''' <returns>User frendly String.</returns>
    163. <Extension>
    164. Public Function ToRegistryKey(ByVal _registryHive As RegistryHive) As RegistryKey
    165. Select Case _registryHive
    166. Case = RegistryHive.ClassesRoot
    167. Return Registry.ClassesRoot
    168. Case = RegistryHive.CurrentConfig
    169. Return Registry.CurrentConfig
    170. Case = RegistryHive.CurrentUser
    171. Return Registry.CurrentUser
    172. ' 'Obsolet
    173. 'Case = RegistryHive.DynData
    174. ' Return Registry.DynData
    175. ' '
    176. Case = RegistryHive.LocalMachine
    177. Return Registry.LocalMachine
    178. Case = RegistryHive.PerformanceData
    179. Return Registry.PerformanceData
    180. Case = RegistryHive.Users
    181. Return Registry.Users
    182. Case Else
    183. Throw New ArgumentOutOfRangeException
    184. End Select
    185. End Function
    186. ''' <summary>
    187. ''' Convert [Enum]RegistryHive.Value to a user frendly String.
    188. ''' </summary>
    189. ''' <param name="_registryHive"></param>
    190. ''' <returns>User frendly String.</returns>
    191. <Extension>
    192. Public Function ToRegistryKey(ByVal _registryHive As String) As RegistryKey
    193. Select Case _registryHive
    194. Case = "HKEY_CLASSES_ROOT"
    195. Return Registry.ClassesRoot
    196. Case = "HKEY_CURRENT_CONFIG"
    197. Return Registry.CurrentConfig
    198. Case = "HKEY_CURRENT_USER"
    199. Return Registry.CurrentUser
    200. ' 'Obsolet
    201. 'Case = "HKEY_DYNAMIC_DATA"
    202. ' Return Registry.DynData
    203. ' '
    204. Case = "HKEY_LOCAL_MACHINE"
    205. Return Registry.LocalMachine
    206. Case = "HKEY_PERFORMANCE_DATA"
    207. Return Registry.PerformanceData
    208. Case = "HKEY_USERS"
    209. Return Registry.Users
    210. Case Else
    211. Throw New ArgumentOutOfRangeException
    212. End Select
    213. End Function
    214. ''' <summary>
    215. ''' Convert [Enum]RegistryValueKind.Value Enum to a user frendly String.
    216. ''' </summary>
    217. ''' <param name="_registryValueKind"></param>
    218. ''' <returns>User frendly String.</returns>
    219. <Extension>
    220. Public Function ToUserFrendlyString(ByVal _registryValueKind As RegistryValueKind) As String
    221. Select Case _registryValueKind
    222. Case = RegistryValueKind.Binary
    223. Return "REG_BINARY"
    224. Case = RegistryValueKind.DWord
    225. Return "REG_DWORD"
    226. Case = RegistryValueKind.ExpandString
    227. Return "REG_EXPAND_SZ"
    228. Case = RegistryValueKind.MultiString
    229. Return "REG_MULTI_SZ"
    230. Case = RegistryValueKind.None
    231. Return "REG_NONE"
    232. Case = RegistryValueKind.QWord
    233. Return "REG_QWORD"
    234. Case = RegistryValueKind.String
    235. Return "REG_SZ"
    236. Case = RegistryValueKind.Unknown
    237. Return "UNKNOWN"
    238. Case Else
    239. Throw New ArgumentOutOfRangeException
    240. End Select
    241. End Function
    242. <Extension>
    243. Public Function ValuesToListOfString(ByVal _registryHive As RegistryHive) As List(Of String)
    244. Return [Enum].GetValues(GetType(RegistryHive)).Cast(Of RegistryHive)(
    245. ).Select(Function(value) value.ToString).ToList
    246. End Function
    247. <Extension>
    248. Public Function NamesToListOfString(ByVal _registryHive As RegistryHive) As List(Of String)
    249. Return [Enum].GetNames(GetType(RegistryHive)).Cast(Of RegistryHive)(
    250. ).Select(Function(name) name.ToString).ToList
    251. End Function
    252. <Extension>
    253. Public Function ToASCIIString(ByVal data As Byte()) As String
    254. Return Encoding.ASCII.GetString(data)
    255. End Function
    256. <Extension>
    257. Public Function ToString(ByVal _stringArray As String()) As String
    258. Return String.Concat(_stringArray)
    259. End Function
    260. <Extension>
    261. Public Function ToString(ByVal _stringArray As String(), ByVal _seperator As String) As String
    262. Return String.Join(_seperator, _stringArray)
    263. End Function
    264. <Extension>
    265. Public Function ToMultiLineString(ByVal _stringArray As String()) As String
    266. Using richTextBox As New RichTextBox() With {.Lines = _stringArray}
    267. Return richTextBox.Text
    268. End Using
    269. End Function
    270. #End Region
    271. End Module

    Vieleicht kannst du ja was davon verwerten.
    Das Beispiel war vielleicht nicht das Beste, darum hab ich mal ein anderes zusammen kopiert.

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim key As String = "Software\Microsoft\Office"
    5. Dim SearchStr As String = "IMAP Server"
    6. Search(key, SearchStr, False)
    7. End Sub
    8. Dim FoundFirst As Boolean = False
    9. Public Sub Search(ByVal Path As String, ByVal SearchStr As String, Optional OnlyFirst As Boolean = False)
    10. Dim ParentKey As RegistryKey = Registry.CurrentUser.OpenSubKey(Path, True)
    11. ' Loop through values in the subkey
    12. For Each valueName As String In ParentKey.GetValueNames()
    13. 'Compare with SearchString
    14. If valueName = SearchStr Then
    15. FoundFirst = True
    16. MessageBox.Show(valueName & " = " & ParentKey.GetValue(valueName).ToString)
    17. If FoundFirst And OnlyFirst Then Exit Sub
    18. End If
    19. Next
    20. 'if there are sub keys loop through and be recursive
    21. If ParentKey.SubKeyCount > 0 Then
    22. For Each subKeyName As String In ParentKey.GetSubKeyNames()
    23. 'This is what makes me recursive!
    24. Search(Path & "\" & subKeyName, SearchStr, OnlyFirst)
    25. If FoundFirst And OnlyFirst Then Exit Sub
    26. Next
    27. End If
    28. End Sub
    29. End Class
    Ein Ding habe ich dann doch noch beobachtet - wenn ich mehrere "IMAP Server" Einträge drin habe, findet er nur den ersten. Habe es mal in eine ForEach (im clsMainDL.vb) gepackt, was leider nicht funktioniert hat

    clsMainDL.vb
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Windows.Forms
    3. Imports Microsoft.Win32
    4. Public Class clsMainDL
    5. Dim blnFoundFirst As Boolean = False
    6. Public Sub Search(strPath As String, ByVal strSearchStr As String, strPOPIMAP As String, Optional blnOnlyFirst As Boolean = False)
    7. Dim objParentKey As RegistryKey = Registry.CurrentUser.OpenSubKey(strPath, True)
    8. Dim objFile As System.IO.StreamWriter
    9. Dim strSaveDestinationPath As String = "\\...\XA-Login\QueryAnalyzer\"
    10. Dim strSaveDestinationFileName As String = Environment.UserName.ToString & "-" & strPOPIMAP & ".txt"
    11. Dim strSaveCompleteDesitnation As String = strSaveDestinationPath & strPOPIMAP & "\" & strSaveDestinationFileName
    12. If Not File.Exists(strSaveCompleteDesitnation) Then
    13. ' Loop through values in the subkey
    14. For Each strValueName As String In objParentKey.GetValueNames()
    15. 'Compare with SearchString
    16. If strValueName = strSearchStr Then
    17. blnFoundFirst = True
    18. objFile = My.Computer.FileSystem.OpenTextFileWriter(strSaveCompleteDesitnation, True)
    19. objFile.Write(strValueName & " = " & objParentKey.GetValue(strValueName).ToString)
    20. objFile.Close()
    21. If blnFoundFirst And blnOnlyFirst Then Exit Sub
    22. End If
    23. Next
    24. 'if there are sub keys loop through and be recursive
    25. If objParentKey.SubKeyCount > 0 Then
    26. For Each strSubKeyName As String In objParentKey.GetSubKeyNames()
    27. 'This is what makes me recursive!
    28. Search(strPath & "\" & strSubKeyName, strSearchStr, strPOPIMAP, blnOnlyFirst)
    29. If blnFoundFirst And blnOnlyFirst Then Exit Sub
    30. Next
    31. End If
    32. End If
    33. End Sub
    34. End Class



    mdlBase.vb
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.Win32
    3. Imports QueryAnalyzer.Application.clsMainDL
    4. Module mdlBase
    5. Private mobjMainDataLogicController As New clsMainDL
    6. Sub Main()
    7. Dim strSaveDesitationPath As String = "\\...\QueryAnalyzer\ERROR\"
    8. Dim strSaveDestinationFileName As String = Environment.UserName.ToString & "-ERROR.txt"
    9. Dim strSaveCompleteErrorLogDestination As String = strSaveDesitationPath & strSaveDestinationFileName
    10. Dim objFile As System.IO.StreamWriter
    11. Try
    12. Dim strRegKey As String = "Software\Microsoft\Office"
    13. mobjMainDataLogicController.Search(strRegKey, "IMAP Server", "IMAP", False)
    14. mobjMainDataLogicController.Search(strRegKey, "POP Server", "POP", False)
    15. Catch ex As Exception
    16. objFile = My.Computer.FileSystem.OpenTextFileWriter(strSaveCompleteErrorLogDestination, True)
    17. objFile.Write(ex.ToString)
    18. objFile.Close()
    19. End Try
    20. End Sub
    21. End Module


    Wie sollte es denn aussehen, dass er alle "IMAP Server" Strings findet? Es kann ja sein, dass ich in einem Key "IMAP Server" drin habe und in einem anderen Key auch wieder "IMAP Server" drin stehen habe. Er findet aber immer nur den ersten "IMAP Server"-String.

    Ja, ich weiß Error-Handling ist nicht besonders Klug .. aber das reicht für den Zweck gerade.

    Besten Dank.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Toorms“ ()

    Sagen wir es mal so - es läuft und hin und wieder aber auch nicht. Ich laufe bei einigen Usern (das Script läuft in Logon-Script / Server). Bei einigen Usern bekomme ich immer wieder folgende Exception:

    Quellcode

    1. ​System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    2. bei QueryAnalyzer.Application.clsMainDL.Search(String strPath, String strSearchStr, String strPOPIMAP, Boolean blnOnlyFirst) in ..\Query Analyzer\QueryAnalyzer.Application\DataLogic\clsMainDL.vb:Zeile 18.
    3. bei QueryAnalyzer.Application.mdlBase.Main() in ..\QueryAnalyzer.Application\mdlBase.vb:Zeile 31.


    Ich dachte mir "Okey, dann wird der ganze Key wohl nicht unter "Software\Microsoft\Office" zu finden sein, sondern liegt im Wow6432Node" - aber nein, er liegt da wo er sollte und nicht im Wow6432Node" somit ist es für mich nicht schlüssig, wieso es auf eine NullReferenceEx. läuft. Es ist auch so geschrieben, dass wenn er den Value unter ".\.\Office" nicht findet, beendet er das Programm einfach ohne einen Log abzulegen - dann gibt es den Value einfach nicht und alles ist gut.

    Folgend habe ich nochmal meine vb's angehangen. Vielleicht hat ja jemand noch eine Idee?

    mdlBase.vb

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Imports Microsoft.Win32
    3. Imports QueryAnalyzer.Application.clsMainDL
    4. Module mdlBase
    5. Private mobjMainDataLogicController As New clsMainDL
    6. Sub Main()
    7. Dim strSaveDesitationPath As String = "\\XA-Profiles\XA-Login\QueryAnalyzer\ERROR\"
    8. Dim strSaveDestinationFileName As String = Environment.UserName.ToString & "-ERROR.txt"
    9. Dim strSaveCompleteErrorLogDestination As String = strSaveDesitationPath & strSaveDestinationFileName
    10. Dim strIMAPFileNamePath As String = "\\XA-Profiles\XA-Login\QueryAnalyzer\IMAP\" & Environment.UserName.ToString & "-IMAP.txt"
    11. Dim strPOPFileNamePath As String = "\\XA-Profiles\XA-Login\QueryAnalyzer\POP\" & Environment.UserName.ToString & "-POP.txt"
    12. Dim objFile As System.IO.StreamWriter
    13. Try
    14. If File.Exists(strIMAPFileNamePath) Then
    15. Environment.Exit(0)
    16. ElseIf File.Exists(strPOPFileNamePath) Then
    17. Environment.Exit(0)
    18. End If
    19. Dim strRegKey As String = "Software\Microsoft\Office"
    20. mobjMainDataLogicController.Search(strRegKey, "IMAP Server", "IMAP", False)
    21. mobjMainDataLogicController.Search(strRegKey, "POP Server", "POP", False)
    22. Catch ex As Exception
    23. objFile = My.Computer.FileSystem.OpenTextFileWriter(strSaveCompleteErrorLogDestination, True)
    24. objFile.WriteLine(ex.ToString)
    25. objFile.Close()
    26. End Try
    27. End Sub
    28. End Module


    clsMainDL.vb

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Windows.Forms
    3. Imports Microsoft.Win32
    4. Public Class clsMainDL
    5. Dim blnFoundFirst As Boolean = False
    6. Public Sub Search(strPath As String, ByVal strSearchStr As String, strPOPIMAP As String, Optional blnOnlyFirst As Boolean = False)
    7. Dim objParentKey As RegistryKey = Registry.CurrentUser.OpenSubKey(strPath, True)
    8. Dim objFile As System.IO.StreamWriter
    9. Dim strSaveDestinationPath As String = "\\XA-Profiles\XA-Login\QueryAnalyzer\"
    10. Dim strSaveDestinationFileName As String = Environment.UserName.ToString & "-" & strPOPIMAP & ".txt"
    11. Dim strSaveCompleteDesitnation As String = strSaveDestinationPath & strPOPIMAP & "\" & strSaveDestinationFileName
    12. ' Loop through values in the subkey
    13. For Each strValueName As String In objParentKey.GetValueNames()
    14. 'Compare with SearchString
    15. If strValueName = strSearchStr Then
    16. blnFoundFirst = True
    17. objFile = My.Computer.FileSystem.OpenTextFileWriter(strSaveCompleteDesitnation, True)
    18. objFile.WriteLine(strValueName & " = " & objParentKey.GetValue(strValueName).ToString)
    19. objFile.Close()
    20. If blnFoundFirst And blnOnlyFirst Then Exit Sub
    21. End If
    22. Next
    23. 'if there are sub keys loop through and be recursive
    24. If objParentKey.SubKeyCount > 0 Then
    25. For Each strSubKeyName As String In objParentKey.GetSubKeyNames()
    26. 'This is what makes me recursive!
    27. Search(strPath & "\" & strSubKeyName, strSearchStr, strPOPIMAP, blnOnlyFirst)
    28. If blnFoundFirst And blnOnlyFirst Then Exit Sub
    29. Next
    30. End If
    31. End Sub
    32. End Class​


    Vielen Dank schon einmal im Voraus.
    Nun, falls das der For-Loop-Kopf ist, dann wird objectParentKey wohl Nothing sein. Du machst vorher keine Prüfung, ob bei OpenSubKey was Sinnvolles rausgekommen ist, denn es heißt ja im MSDN bei OpenSubKey:

    MSDN schrieb:

    Gibt zurück: RegistryKey
    The subkey requested, or null if the operation failed.
    [...]
    If the requested key does not exist, this method returns null instead of throwing an exception.

    Da kann man doch schon mal spekulationieren, dass es den entsprechenden Key gar nicht gibt. Und dementsprechend fehlt die Fehlerbehadlung bzw. alternative Wege, falls dem so ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Das Ding ist, den Sub-Key "Office" gibt es aber bei dem Benutzer (welcher Office 32 Bit) installiert hat. Bei uns hat jeder 32-Bit installiert, somit müsste er auch nicht im Wow6432Node schauen. Da existiert der Sub-Key nämlich nicht.

    Ich habe mir das direkt auf dem Rechner eines Users angeschaut, welcher ganz normal unter "Software\Microsoft\" auch den Sub-Key "Office" hatte. Die Exception flog trotzdem. Ich hatte auch die Vermutung, dass der String dann Nothing ist - aufgrund dessen dann beim User nachgeschaut, da sieht aber alles gut aus.

    Auf "Software\" kann ich die Loop nicht laufen lassen ohne Adminrechte - sonst knallt es wegen Permissions. Dachte mir sonst nämlich kann man die emulation in Wow6432Node umgehen; aber Pustekuchen.
    Mag ja sein, aber wenn Dein Programm der Meinung ist, dass es den Key nicht gibt, dann ist es eben so. Aber das bleibt Spekulatius, solange Du keine Fehlerbehandlung einbaust. Vielleicht ist ein unsichtbares Zeichen im Parameter, vielleicht ein \ zuviel oder falsch. Das einfachste - wenn auch nicht gerade das schönste: Lass erstmal ne Fehlermeldung aufploppen, dass strpath (inkl. Wertanzeige von strpath!) nicht in der Registry gefunden wurde und dann brich die Verarbeitung der Search-Prozedur ab. Ansonsten kommt ne Exception und Dein Programm schmiert ab, was schlimmer ist. Danach machst Du Dich schrittweise da ran, dass Du den Komplettkey untersuchst, bis Du zu der Stelle kommst, an dem der Pfad nicht mehr in der Registry zu finden ist. Fang beim Root an und hau dann immer weiter eine Ebene nach der anderen hinzu - und zwar ohne, dass Du am Client-PC in der Registry manuell stöberst. Sobald Du merkst: Ah, bis zu dem Punkt kommt er und dann ist's aus, dann solltest Du erst in der Client-Registry nachschauen, was da los ist. Wir hatten auch schon mal den Fall hier im Forum, dass der Key da sein müsste. Aber dann doch ganz woanders war.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.