DomänenName zu IP oder so

DrMueller

Erfahrenes Mitglied
Hallo Leute,
ich hab im Zuge eines Auftrags das Problem, dass ich die zurzeit verwendete Domäne auslesen sollte. Dies wäre am einfachsten über die IP zu handhaben, dachte ich mir.

Nun kann ich zurzeit leider keine Rückfrage halten, daher kann ich mir nicht sicher sein, ob ich den WMI-Dienst als gegeben sehen kann resp. das er läuft.

Es sollte natürlich immer und überall funktionieren...

Ich habe drei Varianten ausprobiert:

WMI:
Code:
  Dim oNameSpace  As Object
  Dim oDomain     As Object
 
  On Error GoTo ErrHandler
  Set oNameSpace = GetObject("WinNT:")
 
  For Each oDomain In oNameSpace
    MsgBox oDomain.Name
  Next
  On Error GoTo 0
  Exit Sub

Klappt soweit gut, wie gesagt, ich bin nicht sicher, iwe ich das Objekt dann weiter verarbeiten kann, auch auf welchen System das wie gut läuft ist recht unklar. Ausserdem eben: WMI.


Zweite Idee:
Aus den Tiefen von Google gefunden:
Code:
   Dim wshShell As Object
   Dim wshNetwork As Object
   Dim sDomain As String
   Set wshNetwork = CreateObject("WScript.Network")

   sDomain = wshNetwork.UserDomain
   Set wshNetwork = Nothing
   If sDomain = "" Then 'probably w9x system
      Set wshShell = CreateObject("WScript.Shell")
      sDomain = wshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\MSNP32\NetworkProvider\AuthenticatingAgent")
   End If
   Set wshShell = Nothing
   MsgBox sDomain


Diesen Reg gibts gar nicht, aber die Domain wird schon über UserDomain ausgelesen.
Leider habe ich das Problem, dass nicht die Domain, sondern der PC Name ausgelesen wird¿ Oder verwechsel ich hier was?



Dritte und komplexeste Variante:
APIs:
Code:
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegQueryValueEx& Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long)
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Private Const HKLM = &H80000002
Private Const ERROR_SUCCESS = 0&
Private Const KEY_ALL_ACCESS = &HF003F
Private Const REG_SZ = 1
Private Const MAX_SIZE = 1024

Private Const w9xDomainKey = "SYSTEM\CurrentControlSet\Services\MSNP32\NetworkProvider"
Private Const w9xGroupKey = "SYSTEM\CurrentControlSet\Services\VxD\VNETSUP"

Private Function GetUserDomain() As String
  Dim sDomain As String
'First, try using Evironment variable (works for NT system)
  sDomain = Environ$("USERDOMAIN")
'If fail, try for w9x domain registry key
  If sDomain = "" Then sDomain = GetRegValueStr(w9xDomainKey, "AuthenticatingAgent")
'And finally, try with w9x working group key
  If sDomain = "" Then sDomain = GetRegValueStr(w9xGroupKey, "Workgroup")
  GetUserDomain = sDomain
  MsgBox sDomain
End Function

Private Function GetRegValueStr(sKey As String, sSubKey As String) As String
  Dim hKey As Long, sTemp As String
  GetRegValueStr = ""
  If RegOpenKeyEx(HKLM, sKey, 0&, KEY_ALL_ACCESS, hKey) <> ERROR_SUCCESS Then Exit Function
  sTemp = Space$(MAX_SIZE)
  If RegQueryValueEx(hKey, sSubKey, 0&, REG_SZ, ByVal sTemp, MAX_SIZE) = ERROR_SUCCESS Then
     GetRegValueStr = Trim$(StripNulls(sTemp))
  End If
  RegCloseKey hKey
End Function

Private Function StripNulls(ByVal sText As String) As String
  Dim nPosition&
  StripNulls = sText
  nPosition = InStr(sText, vbNullChar)
  If nPosition Then StripNulls = Left$(sText, nPosition - 1)
  If Len(sText) Then If Left$(sText, 1) = vbNullChar Then StripNulls = ""
End Function

Scheint das Komplexeste zu sein, doch auch hier wird mir irgendwie der Computername ausgegeben...

Ich bin recht unschlüssig, daher wollte ich mal fragen, wie Ihr das Problem gelöst habt. Vor allem, dass bei zwei Varianten der Computername ausgelesen wird, irritiert mich sehr.
 
Zurück