• Login
sketchucation logo sketchucation
  • Login
🤑 SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

Get MAC Address

Scheduled Pinned Locked Moved Developers' Forum
55 Posts 8 Posters 4.9k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    Garry K
    last edited by 10 Dec 2013, 15:53

    Is there an OS independent way to get the MAC Address of the client within a sketchup script and without having to install additional software on the client's machine.

    I'd like to tie in some hardware id of some sort to a web site registration for that computer and user.

    1 Reply Last reply Reply Quote 0
    • G Offline
      Garry K
      last edited by 10 Dec 2013, 17:41

      Here is what I can do so far.

      and if windows I can parse the output

      but with osx I don't know what I should expect

      ` platform = RUBY_PLATFORM.downcase

      if ( platform.include?( "win" ))
      windows = true
      cmd = 'ipconfig /all'
      else
      windows = false
      cmd = 'ifconfig'
      end

      then for windows I can redirect the output of ipconfig

      null = test(?e, '/dev/null') ? '/dev/null' : 'NUL'
      lines = IO.popen("#{ cmd } 2> #{ null }"){|fd| fd.readlines}
      puts lines`

      some of the output for windows
      So the Ethernet adapter is usually soldered on the mother board these days and should be reasonably safe.
      parse out Physical Address is the MAC Address for the Ethernet

      ` Ethernet adapter Local Area Connection:

      Media State . . . . . . . . . . . : Media disconnected
      Connection-specific DNS Suffix . :
      Description . . . . . . . . . . . : Atheros L1 Gigabit Ethernet 10/100/1000Base-T Controller
      Physical Address. . . . . . . . . : 00-1D-60-0D-80-87
      DHCP Enabled. . . . . . . . . . . : No
      Autoconfiguration Enabled . . . . : Yes`

      1 Reply Last reply Reply Quote 0
      • G Offline
        Garry K
        last edited by 10 Dec 2013, 18:20

        always something new to learn !!!

        this works in windows. It would be nice if it would run quitetly.

        puts ipconfig /all

        1 Reply Last reply Reply Quote 0
        • G Offline
          Garry K
          last edited by 10 Dec 2013, 19:51

          I'm reading that back ticks ` won't work in OSX and that using back ticks in windows is not as secure as the following

          puts %x[ipconfig /all]

          1 Reply Last reply Reply Quote 0
          • S Offline
            slbaumgartner
            last edited by 10 Dec 2013, 19:57

            @garry k said:

            I'm reading that back ticks ` won't work in OSX

            Where are you reading that? They work fine for me (of course, SU may "beachball" while Ruby blocks waiting for output from a slow command).

            Steve

            1 Reply Last reply Reply Quote 0
            • G Offline
              Garry K
              last edited by 10 Dec 2013, 20:11

              This link makes references to it

              Link Preview Image
              Getting output of system() calls in Ruby

              If I call a command using Kernel#system in Ruby, how do I get its output? system("ls")

              favicon

              Stack Overflow (stackoverflow.com)

              1 Reply Last reply Reply Quote 0
              • D Offline
                driven
                last edited by 10 Dec 2013, 20:41

                @garry k said:

                I'm reading that back ticks ` won't work in OSX

                where are you reading that? they are interchangeable on a mac. Both return in Ruby Console.

                > puts `ifconfig -a | grep "ether"`
                	ether 00;** ;** ;** ;** ;36 
                	ether 00;** ;** ;** ;** ;ad 
                nil
                > puts %x(ifconfig -a | grep "ether")
                	ether 00;** ;** ;** ;** ;36 
                	ether 00;** ;** ;** ;** ;ad 
                nil
                
                

                but ifconfig will give you more that one ether, so...

                 puts (%x(ifconfig -a | grep "ether")).split[1]
                "00;** ;** ;** ;** ;36"
                nil
                
                

                or mac only [I think]

                
                > > puts (%x(netstat -in | grep "en0")).split[3].inspect
                "00;** ;** ;** ;** ;36"
                nil
                

                you'll get what you want...

                john

                learn from the mistakes of others, you may not live long enough to make them all yourself...

                1 Reply Last reply Reply Quote 0
                • S Offline
                  slbaumgartner
                  last edited by 10 Dec 2013, 20:47

                  @garry k said:

                  This link makes references to it

                  Link Preview Image
                  Getting output of system() calls in Ruby

                  If I call a command using Kernel#system in Ruby, how do I get its output? system("ls")

                  favicon

                  Stack Overflow (stackoverflow.com)

                  That link discusses the various ways to capture the output of a system command and security issues that arise from issuing a system command from Ruby. Nowhere does it say that the backtick syntax does not work on Mac OS X!

                  1 Reply Last reply Reply Quote 0
                  • Dan RathbunD Offline
                    Dan Rathbun
                    last edited by 10 Dec 2013, 23:15

                    Garry.. this is safer and faster to use boolean Constants throughout your module(s) [ie, Strings are slow.]

                    At the top of your module:
                    MAC = OSX = RUBY_PLATFORM !~ /mswin|mingw/ PC = WIN = (not MAC)

                    Then say down further:

                    if WIN
                      # do this
                    else
                      # it's a Mac, do that
                    end
                    

                    another example, showing a webdialog:
                    WIN ? @dlg.show() : @dlg.show_modal()

                    ~

                    I'm not here much anymore.

                    1 Reply Last reply Reply Quote 0
                    • Dan RathbunD Offline
                      Dan Rathbun
                      last edited by 10 Dec 2013, 23:41

                      @garry k said:

                      then for windows I can redirect the output of ipconfig

                      null = test(?e, '/dev/null') ? '/dev/null' : 'NUL'

                      Why? The %x or backquoted string method returns it's result.

                      so:
                      ip = %x[ipconfig /all]
                      Then parse the string ip,.. iterate it using each_line or
                      split("\n") it into an array of lines, then use find, etc.

                      I'm not here much anymore.

                      1 Reply Last reply Reply Quote 0
                      • D Offline
                        driven
                        last edited by 10 Dec 2013, 23:57

                        @dan

                        does reply_from_ifconig.split("\n").grep("Physical Address") or similar work on a PC?

                        john
                        EDIT for something as un-changing as ifconfig on a mac you could use

                        (%x(ifconfig -a)).split("\n")[10].split[1]
                        

                        learn from the mistakes of others, you may not live long enough to make them all yourself...

                        1 Reply Last reply Reply Quote 0
                        • P Offline
                          pgarmyn
                          last edited by 15 Dec 2013, 18:23

                          @dan rathbun said:

                          similar:
                          ipa = %x[ipconfig /all].split("\n").grep /\A\s*(Physical Address)/....

                          Scanning for “Physical Address” only gives a result with an EN/US OS
                          This works also on the old continent :

                          def MyModule.mac_address
                          	platform = RUBY_PLATFORM.downcase
                          	iptxt = `#{(platform =~ /win32/) ? 'ipconfig /all' ; 'ifconfig'}`
                          	## delete DHCPv6 ;
                          	iptxt.gsub!(/..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-..\-../,"") 
                          	# delete Tunnel ;
                          	iptxt.gsub!("00-00-00-00-","")
                          	## create array with all the physical adresses ;
                          	t_array=iptxt.scan(/..\-..\-..\-..\-..\-../)
                          	#puts t_array.inspect 
                          	## returns first physical adresses if one found
                          	return t_array[0] if t_array.length>0 
                          	return nil
                          end
                          
                          1 Reply Last reply Reply Quote 0
                          • D Offline
                            driven
                            last edited by 15 Dec 2013, 19:03

                            There's also this one

                            mac_MAC = %x(ioreg -rd1 -c IOPlatformExpertDevice |  awk "/IOPlatformUUID/ { print $3; }")
                            
                            

                            returns
                            "IOPlatformUUID" = "00000000-0000-1000-8000-00**********" [my address obscured with ***]

                            john

                            learn from the mistakes of others, you may not live long enough to make them all yourself...

                            1 Reply Last reply Reply Quote 0
                            • P Offline
                              pgarmyn
                              last edited by 15 Dec 2013, 19:06

                              @dan rathbun said:

                              DUh... I just stumbled upon GetMAC.exe on my Win 7 machine....

                              Yes, i have it also on Win8.1 👍
                              For the MAC-world (Apple-users) is there an equivalent ❓

                              1 Reply Last reply Reply Quote 0
                              • D Offline
                                driven
                                last edited by 15 Dec 2013, 19:55

                                @pgarmyn said:

                                For the MAC-world (Apple-users) is there an equivalent :?:

                                I just posted it above?

                                The command ioreg located in /usr/sbin/ioreg is used to display the I/O Kit registry.

                                learn from the mistakes of others, you may not live long enough to make them all yourself...

                                1 Reply Last reply Reply Quote 0
                                • P Offline
                                  pgarmyn
                                  last edited by 15 Dec 2013, 20:51

                                  👍 👍 👍 @driven

                                  1 Reply Last reply Reply Quote 0
                                  • D Offline
                                    driven
                                    last edited by 15 Dec 2013, 21:51

                                    @pgarmyn said:

                                    :thumb: :thumb: :thumb: @driven

                                    Well, maybe not three thumbs... it's unclear to me if that's a standard or an xtool instal, so a safer bet would be

                                    getMACADDRESS = %x(/usr/sbin/networksetup -getMACADDRESS en0 | /usr/bin/awk '{print $3}' | /usr/bin/sed s/;//g)
                                    

                                    which returns

                                    001ec*******

                                    the mac MAC address using standard instal items...

                                    john

                                    learn from the mistakes of others, you may not live long enough to make them all yourself...

                                    1 Reply Last reply Reply Quote 0
                                    • Dan RathbunD Offline
                                      Dan Rathbun
                                      last edited by 15 Dec 2013, 22:21

                                      There IS a gem that can be used for reference (perhaps it can be made SketchUp friendly.)

                                      Link Preview Image
                                      macaddr/lib/macaddr.rb at master · ahoward/macaddr

                                      cross platform mac address determination for ruby. Contribute to ahoward/macaddr development by creating an account on GitHub.

                                      favicon

                                      GitHub (github.com)

                                      I'm not here much anymore.

                                      1 Reply Last reply Reply Quote 0
                                      • G Offline
                                        Garry K
                                        last edited by 30 Jan 2014, 17:04

                                        I'm back at this MAC address - specifically for first Ethernet device.

                                        This code seems to work fine for Windows 7 - but will it work for OSX ??

                                        Has anyone tried this in a French computer or some other language?

                                        ` def get_mac_address()
                                        return @mac_address if defined?( @mac_address )

                                        @win = ( RUBY_PLATFORM =~ /darwin/i ) == nil

                                        tmp = ""
                                        str = ""
                                        first = true

                                        if ( @win )
                                        # for windows put results in array - splitting on newline
                                        ipa = %x[ipconfig /all].split("\n")

                                        # check begining of string for 'Ethernet' and set flag once found
                                        # then check for 'Physical Address' and look at everything after the ':'
                                        # set mac_address and return
                                        ipa.each {|line|
                                          tmp = line.strip
                                          str = tmp[0..7]
                                        
                                          if ( first )
                                            first = false if ( "Ethernet" == str )
                                          elsif ( "Physical" == str )
                                            pos = tmp.rindex( ":" )
                                            @mac_address = tmp[pos+2, tmp.length ]
                                            return @mac_address
                                          end
                                        }
                                        

                                        else
                                        tmp = %x[ifconfig eth0].strip
                                        pos = tmp.rindex( " " )
                                        @mac_address = tmp[pos+1, tmp.length ]
                                        return @mac_address
                                        end

                                        return ""
                                        end`

                                        1 Reply Last reply Reply Quote 0
                                        • P Offline
                                          pgarmyn
                                          last edited by 30 Jan 2014, 18:16

                                          @Garry
                                          As i said before, this only works for US or EN OS.
                                          The output of ipconfig depends on the OS language.
                                          In French you will have to scan for "adresse physique" and for the other languages....

                                          1 Reply Last reply Reply Quote 0
                                          • 1
                                          • 2
                                          • 3
                                          • 1 / 3
                                          • First post
                                            Last post
                                          Buy SketchPlus
                                          Buy SUbD
                                          Buy WrapR
                                          Buy eBook
                                          Buy Modelur
                                          Buy Vertex Tools
                                          Buy SketchCuisine
                                          Buy FormFonts

                                          Advertisement