Windows Aktivierung ermitteln....

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Windows Aktivierung ermitteln....

Beitrag von Bisonte »

Hallo.

Gibt es eine Möglichkeit mit PB festzustellen, ob die Windowsversion aktiviert wurde ?

Ich brauche dies, um den ProductKey auszulesen. Den auszulesen ist nicht das Problem, nur wenn bei
der Installation kein Key eingegeben wurde, scheint Windows (zumindest bei 7 in der Virtualbox)
einen zufälligen Key zu generieren.

Wenn nun Windows nicht aktiviert wurde, sollte dann mein "ProductKey - Feld" in meinem Systeminfo Anzeiger
leer bleiben. Wie realisiere ich das mit PB ?

Falls es hilft oder dort evt. ein Fehler steckt, der ProductKey wird ausgelesen mit :

Code: Alles auswählen

#KEY_WOW64_64KEY = $100
#KEY_WOW64_32KEY = $200
Procedure.s GetOSProductKey() ; Gibt den ProductKey des OS zurück.
  
  Protected hKey, Res, size = 280
  Protected i, j, x, Result.s
  Protected *mem = AllocateMemory(size)
  Protected *newmem = AllocateMemory(size)
  Protected *digits = AllocateMemory(25)
  
  PokeS(*digits, "BCDFGHJKMPQRTVWXY2346789", -1, #PB_Ascii)
  If OSVersion() <= #PB_OS_Windows_2000
    Res = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ, @hKey)
  Else
    Res = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ | #KEY_WOW64_64KEY, @hKey)
  EndIf
  If Res = #ERROR_SUCCESS
    RegQueryValueEx_(hKey, "DigitalProductID", 0, 0, *mem, @size)
    RegCloseKey_(hKey)
    If size <> 280
      For i = 24 To 0 Step -1
        x = 0
        For j = 66 To 52 Step -1
          x = (x << 8) + PeekA(*mem + j)
          PokeA(*mem + j, x / 24)
          x % 24
        Next
        PokeA(*newmem + i, PeekA(*digits + x))
      Next
      For i = 0 To 15 Step 5
        Result + PeekS(*newmem + i, 5, #PB_Ascii) + "-"
      Next
      Result + PeekS(*newmem + 20, 5, #PB_Ascii)
    EndIf
  EndIf
  FreeMemory(*mem) : FreeMemory(*newmem) : FreeMemory(*digits)
  
  ProcedureReturn Result
  
EndProcedure
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Aktivierung ermitteln....

Beitrag von RSBasic »

Entweder per Com+ mit Hilfe von "Select * From SoftwareLicensingProduct" oder per vbs "cscript %windir%\System32\slmgr.vbs -dlv".
Registry- und/oder Win32-Lösung kenne ich leider (noch) nicht.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Windows Aktivierung ermitteln....

Beitrag von Bisonte »

RSBasic hat geschrieben:Entweder per Com+ mit Hilfe von "Select * From SoftwareLicensingProduct" oder per vbs "cscript %windir%\System32\slmgr.vbs -dlv".
Registry- und/oder Win32-Lösung kenne ich leider (noch) nicht.
Hast du evt. ein Beispiel für die "Com+" Variante ? ComatePlus hab ich bisher nie verwendet... das per vbs haut ja allerhand Daten raus, da wäre ich mir nicht sicher, das diese mit Stringmanipulation ausgewerteten Daten in allen Sprachen gleich wäre...(Deutsch/Englisch usw...), ausserdem funktioniert das z.B. mit
meiner aktuell genutzten Installation nicht, da der Script Host nicht vorhanden ist.

Ich hab da sogar API auf MSDN gefunden... Problem dabei ist allerdings, das diese API mit Win 7 nicht mehr funktioniert.

P.S.: Wenn man die verbleibende Zeit bis zur Aktivierung irgendwie auslesen könnte (vlt. Registry) würde das ja schon ausreichen... Nach dem Motto : Aha, is noch nich...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Aktivierung ermitteln....

Beitrag von RSBasic »

Ah ok. Hm schade, dass diese Funktion nicht mehr verfügbar ist, warum auch immer.
Ich habe mal bisschen gegoogelt, aber ich konnte da leider nichts finden, außer eine WMI- und VBS-Lösung.
Ansonsten was du mal machen kannst, wenn du Langeweile hast, das folgende Programm bei dir installieren: http://www.chip.de/downloads/Process-Mo ... 25020.html
Die Anwendung zeichnet u.a. Registry-Zugriffe auf. Wenn du nun beispielsweise System-Eigenschaften aufrufst, dann wird in diesem Fenster unten überprüft, ob Windows aktiviert wurde oder nicht. Wenn du Glück hast und es gibt ein Verweis in der Registry, dann kannst du mit Process Monitor den Registry-Pfad ermitteln.

Bezüglich WMI: Du kannst ja die Include-Datei "COMatePLUS.pbi" von srod herunterladen. Dort gibt es unter "\Basic demos\WMI demos" Beispielcodes, die du verwenden kannst. Einfach ein Beispielcode nehmen und die SQL-Anweisung anpassen. Getestet habe ich es aber nicht.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Shardik
Beiträge: 752
Registriert: 25.01.2005 12:19

Re: Windows Aktivierung ermitteln....

Beitrag von Shardik »

Bisonte hat geschrieben:Ich hab da sogar API auf MSDN gefunden... Problem dabei ist allerdings, das diese API mit Win 7 nicht mehr funktioniert.
Du hast anscheinend den von Dir angeführten Link nicht bis zum Ende gelesen: :wink:
SLIsGenuineLocal
For Windows 7, Windows Server 2008, and newer systems, please use SLIsGenuineLocal .
zachd [MSFT]
9/3/2010
Im Übrigen hat luis bereits im englischen Forum gezeigt, wie man testet, ob Windows Vista (funktioniert auch mit Windows 7) "genuine" ist:
http://www.purebasic.fr/english/viewtop ... 21&start=1
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows Aktivierung ermitteln....

Beitrag von RSBasic »

Ich auch nicht. :oops:
Danke Shardik :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Windows Aktivierung ermitteln....

Beitrag von Bisonte »

Ich und English... aber ich würd da nicht verhungern ;)

Danke für den Link... aber dcer Code von luis sagt mir immer, das das eine genuine version ist... egal ob aktiviert oder nicht...
ich muss da noch mal das SLIs zeugs lesen ... ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: Windows Aktivierung ermitteln....

Beitrag von Rudi »

Der Code oben gibt unter Windows 8 einen falschen ProductKey zurück. Darum habe ich das mal etwas angepasst. Wesentliche Änderung ist, dass nun auch ein "N" im Key vorkommen kann/muss. Es darf aber auch nur einmal vorkommen, sonst funktioniert der Code nicht, der übrigens auf einem VB-Script basiert, welches MS zum Download anbietet.

Code: Alles auswählen

#KEY_WOW64_64KEY = $100
#KEY_WOW64_32KEY = $200

EnableExplicit

Procedure.s GetOSProductKey()
	Protected hKey, Res, size = 280
	Protected i, j, x, Result.s, isWin8, Last
	Protected *mem = AllocateMemory(size)
	Protected *newmem = AllocateMemory(size)
	Protected *digits = AllocateMemory(25)
	
	PokeS(*digits, "BCDFGHJKMPQRTVWXY2346789", -1, #PB_Ascii)
	If OSVersion() <= #PB_OS_Windows_2000
		Res = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ, @hKey)
	Else
		Res = RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT\CurrentVersion", 0, #KEY_READ|#KEY_WOW64_64KEY, @hKey)
	EndIf
	
	If Res = #ERROR_SUCCESS
		RegQueryValueEx_(hKey, "DigitalProductID", 0, 0, *mem, @size)
		RegCloseKey_(hKey)
		isWin8 = Bool((PeekA(*mem+66)/6) And 1)
		PokeA(*mem+66, Bool((PeekA(*mem+66) And $F7) Or ((isWin8 And 2) * 4)))
		
		If size <> 280
			For i = 24 To 0 Step -1
				x = 0
				For j = 66 To 52 Step -1
					x = (x << 8) + PeekA(*mem + j)
					PokeA(*mem + j, x / 24)
					x % 24
				Next
				PokeA(*newmem + i, PeekA(*digits + x))
				Last = x
			Next
			
			If isWin8 = #True
				For i=0 To Last-1
					PokeA(*newmem + i, PeekA(*newmem + i + 1))
				Next
				PokeA(*newmem + Last, 78)
				If Last = 0
					PokeA(*newmem, 78)
				EndIf
			EndIf
			
			For i = 0 To 15 Step 5
				Result + PeekS(*newmem + i, 5, #PB_Ascii) + "-"
			Next
			Result + PeekS(*newmem + 20, 5, #PB_Ascii)
		EndIf
	EndIf
	FreeMemory(*mem) : FreeMemory(*newmem) : FreeMemory(*digits)
	
	ProcedureReturn Result
EndProcedure

Debug GetOSProductKey()
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten