2019년 2월 13일 수요일

node.js - 하드웨어 정보 추출하기

node.js 런타임에서 맥 어드레스, CPU ID등의 하드웨어 정보를 추출하는 코드.


const wmic = require('ms-wmic');

function getCleanWmicResult(dirtyString) {
    if (dirtyString.indexOf('\r') > -1) {
        dirtyString = dirtyString.substring(dirtyString.lastIndexOf('\r') + 1);
    }
    return dirtyString;
}

// get hardware info, using wmic.exe
function getHWInfo() {
    return new Promise(function (resolve, reject) {
        wmic.execute('nic where netenabled=true get MACAddress', function (err, stdOut) {
            if (err) reject(new Error("error case #1"));
            let macAddress = getCleanWmicResult(stdOut).split(':').join('-');
            
            wmic.execute('cpu get processorId', function (err, stdOut) {
                if (err) reject(new Error("error case #2"));
                let cpuID = getCleanWmicResult(stdOut);
                
                resolve({ 'macAddress': macAddress, 'cpuID': cpuID });
            });
        });
    });
}

getHWInfo().then(function (data) {
    // data.macAddress, data.cpuID, ...
}).catch(function (err) {
    console.error(err);
});


ms-wmic 모듈을 이용하였다. ms-wmic 모듈이 윈도우의 wmic.exe를 참조하는 방식으로 동작하기 때문에 wmic.exe 위치가 PATH 환경 변수에 포함되어 있어야 한다. 아니면 wmic.exe를 노드 실행 파일과 같은 위치에 두어도 된다.

getHWInfo()가 하드웨어 정보를 추출하는 코드고, getCleanWmicResult()란 함수를 만든 이유는 ms-wmic가 반환해주는 문자열에 캐리지 리턴(carriage return)이 포함되어 있어서다. (캐리지 리턴 문자 때문에 다른 문자열과 연산했을 때 값이 깨진다.)

* 어쨌든 WMIC(Windows Management Instrumentation Command-line)를 이용하면 윈도우 환경을 한정해서 메인보드 ID, HDD ID 등 하드웨어 인증에 이용될 수 있는 값들을 구할 수 있다는 것.