Page 1 of 1

Unique Computer Identifier

Posted: Tue Mar 31, 2015 8:00 am
by John
I have migrated to a setup that uses dynamic WSIDs but I still wanted to tie some calculated settings to the computer so I needed another unique computer identifier. Since some of my clients have networks in which all of the user names are "user" I decided not to use the user name. After reading this article:

http://www.nextofwindows.com/the-best-w ... s-machine/

I decided to do what they were doing. I encountered some issues with the encoding (unicode) I was getting back and implented a solution suggested here:

http://superuser.com/questions/812438/c ... formatting

Ultimately I came up with a little function that I thought would be nice to share with everyone. So here it is :) To use it you will have to replace the fngethandle references with a static file handle or your own give-me-the-next-available-file-handle-function.

Enjoy,
John Bowman

Code: Select all

00010   library program$: fnunique_computer_id$
00020   print 'fn returns '&fnunique_computer_id$
00022   print 'env is '&env$('Unique_Computer_ID')
00030   end 
10000   def library fnunique_computer_id$*40
10020     if env$('Unique_Computer_ID')='' then 
10040       library 'core\library': fngethandle
10060       dim uci_tmp_filename$*512,tmp_line$*128,uuid$*36,hdd_serial$*36
10080       let uci_tmp_filename$=env$('temp')&'\acs_uuid_tmp'&session$&'.txt'
10100 !     print uci_tmp_filename$
10120       let hdd_serial$=''
10140       let uuid$=''
10160       execute 'sy -m wmic csproduct get UUID |more >'&uci_tmp_filename$
10180 ! execute 'type '&uci_tmp_filename$ : pause
10200 !   execute 'sy -m wmic /output:"'&uci_tmp_filename$&'" csproduct get UUID'   <--encoded in something other than ANSI, hard to read
10205       open #h_tmp:=fngethandle: 'name='&uci_tmp_filename$&',EoL=None',display,input 
10215       linput #h_tmp: tmp_line$
10220       tmp_line$=srep$(tmp_line$,chr$(10),'~')
10225       tmp_line$=srep$(tmp_line$,chr$(13),'~')
10226         tmp_line$=srep$(tmp_line$,' ','')
10230       do while pos(tmp_line$,'~~')>0
10235         tmp_line$=srep$(tmp_line$,'~~','~')
10240       loop
20000       if tmp_line$(1:4)<>'UUID' then print 'problem in fn_unique_computer_id$ - expected to say UUID' : pause 
20020       let uuid$=tmp_line$(6:len(tmp_line$)-1)
20040       close #h_tmp,free: 
20060       if uuid$='FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF' then 
20080         let uuid_valid=0
20100         execute 'sy -m wmic  DISKDRIVE get SerialNumber |more >'&uci_tmp_filename$
20120 !    execute 'sy -m wmic /output:"'&uci_tmp_filename$&'" DISKDRIVE get SerialNumber'   <--encoded in something other than ANSI, hard to read
20140         open #h_tmp:=fngethandle: 'name='&uci_tmp_filename$&',EoL=None',display,input 
20160         linput #h_tmp: tmp_line$
20180         tmp_line$=srep$(tmp_line$,chr$(10),'~')
20200         tmp_line$=srep$(tmp_line$,chr$(13),'~')
20220           tmp_line$=srep$(tmp_line$,' ','')
20240         do while pos(tmp_line$,'~~')>0
20260           tmp_line$=srep$(tmp_line$,'~~','~')
20280         loop
20300         if tmp_line$(1:12)<>'SerialNumber' then print 'problem in fn_unique_computer_id$ - expected to say SerialNumber' : pause 
20340         let hdd_serial$=tmp_line$(14:len(tmp_line$)-1)
20360         close #h_tmp,free: 
20380       else 
20400         let uuid_valid=1
20420       end if 
20440       if uuid_valid then 
20460         let setenv('Unique_Computer_ID',uuid$)
20480       else 
20500         let setenv('Unique_Computer_ID',hdd_serial$)
20520       end if 
20540     end if 
20560     let fnunique_computer_id$=env$('Unique_Computer_ID')
20580   fnend