Jump to content

Getting a computer unique string


spanga
 Share

Recommended Posts

No, I have no problem with your solution -- that's the thing.

What I meant by my remark was that no solution will guarantee unique results from every computer in the world, but your solution seems to come closer to that than the others.

Link to comment
Share on other sites

  • Replies 58
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

All the responses look great - especially the processor ID. However, it's relatively easy to change the processor, and where I work we frequently get machines back from repair with no serial number, model name, manufacturer in the Bios (where WMI gets the info).

However, I rarely see machines with invalid (typically all F's or zeros) UUID's - and haven't seen a blank one yet.

Here's a small script that uses the function _ComputerUUID() to get the computer's UUID:

; Generated by AutoIt Scriptomatic
MsgBox ( 0, @ScriptName, _ComputerUUID() )

Func _ComputerUUID( $strComputer="localhost" )
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $sRetUUID=""
    $objWMIService = ObjGet ( "winmgmts:\\" & $strComputer & "\root\CIMV2" )
    $colItems = $objWMIService.ExecQuery ( "SELECT * FROM Win32_ComputerSystemProduct", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly )
    If IsObj ( $colItems ) then
       For $objItem In $colItems
          $sRetUUID = $objItem.UUID
       Next
    Else
       SetError ( 1 )
       Return $sRetUUID
    Endif
    Return $sRetUUID
EndFunc
Link to comment
Share on other sites

All the responses look great - especially the processor ID. However, it's relatively easy to change the processor, and where I work we frequently get machines back from repair with no serial number, model name, manufacturer in the Bios (where WMI gets the info).

However, I rarely see machines with invalid (typically all F's or zeros) UUID's - and haven't seen a blank one yet.

Here's a small script that uses the function _ComputerUUID() to get the computer's UUID:

; Generated by AutoIt Scriptomatic
MsgBox ( 0, @ScriptName, _ComputerUUID() )

Func _ComputerUUID( $strComputer="localhost" )
    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $sRetUUID=""
    $objWMIService = ObjGet ( "winmgmts:\\" & $strComputer & "\root\CIMV2" )
    $colItems = $objWMIService.ExecQuery ( "SELECT * FROM Win32_ComputerSystemProduct", "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly )
    If IsObj ( $colItems ) then
       For $objItem In $colItems
          $sRetUUID = $objItem.UUID
       Next
    Else
       SetError ( 1 )
       Return $sRetUUID
    Endif
    Return $sRetUUID
EndFunc
Mine returns all F's


Time you enjoyed wasting is not wasted time ......T.S. Elliot
Suspense is worse than disappointment................Robert Burns
God help the man who won't help himself, because no-one else will...........My Grandmother

Link to comment
Share on other sites

@JerryD: Mine returns all F's too.

@Buffo: Your workaround could be great and I really like it. However consider that in machines that are "ghosted" this workaround will have no effect at all. In this way you must have done a clean installation on each machine to get a unique ID from these files you mentioned.

In any case what I would propose is to combine several things in one string such as:

The HD's serial

The processor's ID

The MAC address (if a NIC is present)

...and the length of other non-numerical strings like:

Processor's name

System name

Processor's manufacturer name

Processor's description

...etc etc.

By adding only numbers of ready serials or of the length of alphanumerical strings (that are always unique) will have our unique serial number that can be MD5 hashed afterwards.

Edit: Ah, you may also consider adding the date numbers that Buffo mentioned as well. I think you got the point, the more the better.

Better?

Edited by erebus
Link to comment
Share on other sites

In my situation the uniq id must be data that easily a person(or customer) can give.Another thing.All pcs are ghosted (obviously Operating ids and date files are the same).And then like spanga said this id must not depends an an computer part.(If this part damaged and replaced we have problem) I think ip and public ip for a lan is the best thing to look. So i choose to Look ip for Authentication and send data to my computer after a while(if prog succefully runned) with the public ip.Just to know who is using my prog.Question: Should i look also Gateway for athentication? Gateway is always uniq for a Lan such as Internet caffe? (TO avoid illigan use of my program) This must be depending of the way someone has built the lan .A lan on a store can probably have the same ips with another store.But gateway must be different.am I right?

Edited by Amen
Link to comment
Share on other sites

  • 2 weeks later...

No, you are not.

It is very usual in several LANs (and in internet cafes too) to use the private ip of a common router as a gateway (like 192.168.1.1 for Zyxel, 10.0.0.138 for Alcatel/Thomson, 192.168.0.1 for some others, etc.).

We rarely change the default router's IP and the only case to find public IPs set in Windows network settings is the case to use these IPs outside your router settings and widely set in your LAN (meaning that instead of routing with your router to route from each Windows box).

Link to comment
Share on other sites

You could use the computer serialnumber

; Get the serial number and asset tag of a computer
; 25 November 2005 by Geert (NL)
; Translated VBScript source code: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__computer_hardware.asp
; AutoIt 3.1.x Beta needed

$strComputer = "."
$objWMIService = ObjGet("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & $strComputer & "\root\cimv2")
$colSMBIOS = $objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For $objSMBIOS in $colSMBIOS
    MsgBox(0,"","Part Number: " & $objSMBIOS.PartNumber)
    MsgBox(0,"","Serial Number: " & $objSMBIOS.SerialNumber)
    MsgBox(0,"","Asset Tag: " & $objSMBIOS.SMBIOSAssetTag)
Next
i was going to say home drive serial...
Link to comment
Share on other sites

System UUID on replacement motherboards and quite a number of AMD-based boards have either all F's or all 0's.

Also Part#, Serial#, and Tag # may be all 0's or 1234567890 on replacement boards.

I think a combination of data joined together should do the trick...Consider ComputerName + MAC + Time that OS had been installed should be somewhat unique.

Link to comment
Share on other sites

Basic point.

There isnt going to be something that is totally unique. You will have to probably take many of the above suggestions and combine them. To make a semi-unique string. You could then convert that string to a numerical form run a formula to shorten the string, and then convert back to a new string. Make that the unique value.

There isnt going to be a fool proof way just like bullet proof glass can still be broken. Just its harder.

JS

AutoIt Links

File-String Hash Plugin Updated! 04-02-2008 Plugins have been discontinued. I just found out.

ComputerGetInfo UDF's Updated! 11-23-2006

External Links

Vortex Revolutions Engineer / Inventor (Web, Desktop, and Mobile Applications, Hardware Gizmos, Consulting, and more)

Link to comment
Share on other sites

Another way is to get the computer SID, which will not be unique if the PC's are cloned and are not joined to a domain. The SID on cloned PCs can be changed with ease.

NB system files on cloned PC's will have the same creation and modification date.

Will this provide an absolute unique ID? NO, but nothing will. Even NIC's can have a duplicate MAC address, despite manufacturer having to request MAC ranges from an international association.

If the idea is to ensure unique ID on your network only, this will work.

Read SID, www.sysinternal.com

Change SID, www.sysinternal.com

CheersNobby

Link to comment
Share on other sites

Point made :P

Well done JS, if you would like to post my ClientAuthID UniqueID funcs on your behalf you can :lmao: After all I got ideas from your quotes.

Do I detect a bit of sarcasim? :(

If you think it would possibly help then yes please post it.

JS

AutoIt Links

File-String Hash Plugin Updated! 04-02-2008 Plugins have been discontinued. I just found out.

ComputerGetInfo UDF's Updated! 11-23-2006

External Links

Vortex Revolutions Engineer / Inventor (Web, Desktop, and Mobile Applications, Hardware Gizmos, Consulting, and more)

Link to comment
Share on other sites

Adding (most) of what you all said together allows me to produce these two UDFs:

;===============================================================================
;
; _UniqueWoodID( $com, $no )
; Description:      Used to generate a nearly "unique" ID for a computer
; Parameter(s):     [optional] $com : name of computer to generate ID for (default=localhost)
;                   [optional] $no : shortening value used to shorten id(default: 5)
; Requirement:      AutoIt
; Return Value(s):  The ID for the computer
; Author(s):        Alexander "TechDude" Wood
; Note(s):          Use the SAME shortening value every time you call this function.
;                  I feel that _UniqueWoodID2() is more unique than this
;
;===============================================================================
#Include <String.au3>
Func _UniqueWoodID( $com = "localhost", $no = 5 )
;$time = TimerInit()
    $colItems = ""
    $objWMIService = ObjGet ("winmgmts:\\" & $com & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Processor", "WQL", 0x10 + 0x20)
    If IsObj ($colItems) Then
        For $objItem In $colItems
            $Out1 = _StringEncrypt(1, $objItem.AddressWidth & $objItem.Architecture & $objItem.Caption, _
                    $objItem.ConfigManagerErrorCode & $objItem.ConfigManagerUserConfig & $objItem.DataWidth)
            $Out2 = _StringEncrypt(1, $objItem.Description & $objItem.DeviceID & $objItem.ExtClock, _
                    $objItem.Family & $objItem.InstallDate & $objItem.L2CacheSize)
            $Out3 = _StringEncrypt(1, $objItem.L2CacheSpeed & $objItem.Level & $objItem.Manufacturer, _
                    $objItem.MaxClockSpeed & $objItem.Name & $objItem.OtherFamilyDescription)
            $Out4 = _StringEncrypt(1, $objItem.PNPDeviceID & $objItem.ProcessorId & $objItem.ProcessorType, _
                    $objItem.Revision & $objItem.Role & $objItem.SocketDesignation)
            $Out5 = _StringEncrypt(1, $objItem.SystemCreationClassName & $objItem.SystemName & $objItem.UniqueId, _
                    $objItem.UpgradeMethod & $objItem.Version & $objItem.VoltageCaps)
            $Output = $Out1 & $Out2 & $Out3 & $Out4 & $Out5 & _WoodIDhelper2()
            $Output = _WoodIDhelper( $Output, $no )
        ;MsgBox(0, "Unique Wood's ID", $Output)
        ;MsgBox(0, "Timer", TimerDiff( $time ))
            Return $Output
            ExitLoop;;Only want first match (will have more matches for multipule processor/multithreaded systems)
        Next
    Else
        MsgBox(0, "Unique Wood's ID - ERROR", "No WMI Objects Found for class: " & "Win32_Processor")
        Exit -1
        Return
    EndIf
EndFunc  ;==>_UniqueWoodID
;===============================================================================
;
; _UniqueWoodID2( $com, $no )
; Description:      Used to generate a nearly "unique" ID for a computer
; Parameter(s):     [optional] $com : name of computer to generate ID for (default=localhost)
;                   [optional] $no : shortening value (default: 2 )
; Requirement:      AutoIt
; Return Value(s):  The Wood's ID for the computer
; Author(s):        Alexander "TechDude" Wood
; Note(s):          Use the SAME shortening value every time you call this function.
;
;===============================================================================
Func _UniqueWoodID2( $com = "localhost", $no = 2 )
;$time = TimerInit()
    $colItems = ""
    $objWMIService = ObjGet ("winmgmts:\\" & $com & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery ("SELECT * FROM Win32_Processor", "WQL", 0x10 + 0x20)
    If IsObj ($colItems) Then
        For $objItem In $colItems
            $Out1 = $objItem.AddressWidth & $objItem.Architecture & $objItem.Caption & _
                    $objItem.ConfigManagerErrorCode & $objItem.ConfigManagerUserConfig & $objItem.DataWidth
            $Out2 = $objItem.Description & $objItem.DeviceID & $objItem.ExtClock & _
                    $objItem.Family & $objItem.InstallDate & $objItem.L2CacheSize
            $Out3 = $objItem.L2CacheSpeed & $objItem.Level & $objItem.Manufacturer & _
                    $objItem.MaxClockSpeed & $objItem.Name & $objItem.OtherFamilyDescription
            $Out4 = $objItem.PNPDeviceID & $objItem.ProcessorId & $objItem.ProcessorType & _
                    $objItem.Revision & $objItem.Role & $objItem.SocketDesignation
            $Out5 = $objItem.SystemCreationClassName & $objItem.SystemName & $objItem.UniqueId & _
                    $objItem.UpgradeMethod & $objItem.Version & $objItem.VoltageCaps
            $Output = $Out1 & $Out2 & $Out3 & $Out4 & $Out5 & _WoodIDhelper2()
            $Output = _WoodIDhelper3( _WoodIDhelper( $Output, $no ) )
        ;MsgBox(0, "Unique Wood's ID", $Output)
        ;MsgBox(0, "Timer", TimerDiff( $time ))
            Return $Output
            ExitLoop;;Only want first match (will have more matches for multipule processor/multithreaded systems)
        Next
    Else
        MsgBox(0, "Unique Wood's ID - ERROR", "No WMI Objects Found for class: " & "Win32_Processor")
        Exit -1
        Return
    EndIf
EndFunc  ;==>_UniqueWoodID2
Func _WoodIDhelper( $str, $no=1 );;Used to shorten the string
    If ($no < 1) Or ($no == 1) then Return $str
    $str = StringSplit( $str, "" )
    Local $ret = ""
    For $i = 1 to $str[0] Step $no
        $ret &= $str[$i]
    Next
    Return $ret
EndFunc
Func _WoodIDhelper2()
    Return FileGetTime( @HomeDrive & "\io.sys", 1, 1 ) & FileGetTime( @HomeDrive & "\recycler", 1, 1 ) & FileGetTime( @HomeDrive & "\LocalService\ntuser.ini", 1, 1 )
EndFunc
Func _WoodIDhelper3($str)
    $str = StringSplit( $str, @TAB & " ,_()"& @CR & @LF )
    Local $ret = ""
    For $i = 1 to $str[0]
        $ret &= $str[$i]
    Next
    Return StringUpper( $ret )
EndFunc

Note that the smaller the $no value, the longer the string, but the greater the uniqueness.

Samples:

MsgBox(0, "Version 2 of Wood's Unique ID - $no of 1", _UniqueWoodID2("localhost", 1))
MsgBox(0, "Version 2 of Wood's Unique ID - $no of 2(default)", _UniqueWoodID2())
MsgBox(0, "Version 1 of Wood's Unique ID - $no of 1", _UniqueWoodID("localhost", 1))
MsgBox(0, "Version 1 of Wood's Unique ID - $no of 5(default)", _UniqueWoodID2())

According the the Timing provided by TimerInit() and TimerDiff(), it takes slightly less than 2100 milliseconds of it to calculate the Unique computer ID.

Link to comment
Share on other sites

  • 3 weeks later...

sorry to bring up the old topic... maybe i should have researched this, but if the systems you're using have the system restore tool then you can read this: C:\WINDOWS\system32\Restore\MachineGuid.txt

is all i know is that my system has that (windows xp home edition), and im pretty sure someone mentioned a Guid being nearly if not impossible to reproduce

i see you have some udf's working for you, but i came accross this and remebered this thread :P

Edited by layer
FootbaG
Link to comment
Share on other sites

  • 3 weeks later...

sorry to bring up the old topic... maybe i should have researched this, but if the systems you're using have the system restore tool then you can read this: C:\WINDOWS\system32\Restore\MachineGuid.txt

is all i know is that my system has that (windows xp home edition), and im pretty sure someone mentioned a Guid being nearly if not impossible to reproduce

i see you have some udf's working for you, but i came accross this and remebered this thread :lmao:

I was surfing around, and came across a very easy way to generate a GUID.

;===============================================================================
;
; Function Name:    _GenGUID()
; Description:    Generates a GUID (globally unique identifier)
; Parameter(s):  None
; Requirement(s):   AutiIt 3.1.1 Beta (tested with version 101)
; Return Value(s):  On Success - Returns a string with the GUID
;                  On Failure - ''  and sets @ERROR = 1
; Author(s):        JerryD
; Reference:        http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0221.mspx
;
;===============================================================================
Func _GenGUID()
    Local $sRetGUID
    $TypeLib = ObjCreate ( 'Scriptlet.TypeLib' )
    If IsObj( $TypeLib ) Then
        $sRetGUID = $TypeLib.Guid
        $TypeLib = ''
        Return $sRetGUID
    Else
        $TypeLib = ''
        SetError(1)
        Return ''
    EndIf
EndFunc  ;==>_GenGUID

BTW - I'm running System Resotre, and don't find MachineGuid.txt anywhere. Maybe it's only generated when you actually perform a restore which I've never done, plus I'm running XP Pro.

Jerry

Modified to release object after reading SvenP's comments in How to release an object reference

Edited by JerryD
Link to comment
Share on other sites

You could use the computer serialnumber

; Get the serial number and asset tag of a computer
; 25 November 2005 by Geert (NL)
; Translated VBScript source code: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__computer_hardware.asp
; AutoIt 3.1.x Beta needed

$strComputer = "."
$objWMIService = ObjGet("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & $strComputer & "\root\cimv2")
$colSMBIOS = $objWMIService.ExecQuery _
    ("Select * from Win32_SystemEnclosure")
For $objSMBIOS in $colSMBIOS
    MsgBox(0,"","Part Number: " & $objSMBIOS.PartNumber)
    MsgBox(0,"","Serial Number: " & $objSMBIOS.SerialNumber)
    MsgBox(0,"","Asset Tag: " & $objSMBIOS.SMBIOSAssetTag)
Next
Whooo ! Great to be back :lmao:

Ok well, this didn't work on my computer - I got generic values for everything.

Mind you one thing that might be arguably be better as a reference is ....

well without saying it, one could "hitch a ride" with Microsoft...

hint --> what's the same on each install, is different for each user and can be found within the registry?

hint --> FCKGW RHQQ2 ...

I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...