Electron修改注册表

部分单位电脑上装有还原精灵,electron应用安装时写入的注册表信息都被还原。不得已只好尝试修复注册表信息。

手动修改注册表

唤起注册表编辑器
Win + r, 输入 regedit

双击reg文件修改注册表

  • HKEY_LOCAL_MACHINE\Software\Classes:所有用户的默认文件关联设置
  • HKEY_CURRENT_USER\Software\Classes:当前用户的文件关联设置(覆盖HKEY_LOCAL_MACHINE项中的设置)
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts:用户自定义的打开方式
  1. 文件扩展注册表.reg
    增加文件扩展、对应图表、启动程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Windows Registry Editor Version 5.00

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.yts]

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.yts\OpenWithList]
    "a"="YitongYoushiyun.exe"
    "MRUList"="a"

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.yts\OpenWithProgids]
    "yts File"=hex(0):

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.yts]
    "yts File_backup"="yts File"

    [HKEY_LOCAL_MACHINE\Software\Classes\yts File]
    ""="application/yts"

    [HKEY_LOCAL_MACHINE\Software\Classes\yts File\DefaultIcon]
    ""="C:\\Program Files\\YitongYoushiyun\\resources\\file.ico"

    [HKEY_LOCAL_MACHINE\Software\Classes\yts File\shell]
    ""="open"

    [HKEY_LOCAL_MACHINE\Software\Classes\yts File\shell\open]
    ""="Open with YitongYoushiyun"

    [HKEY_LOCAL_MACHINE\Software\Classes\yts File\shell\open\command]
    ""="C:\\Program Files\\YitongYoushiyun\\YitongYoushiyun.exe \"%1\""
  2. 开机启动.reg

    1
    2
    Windows Registry Editor Version 5.00

通过命令修改注册表

当没有系统权限时,通过命令往往会失败。需要提升权限执行

redegit 命令

1
2
3
4
5
6
7
8
9
# /s 静默执行
regedit /s "C:\Program Files\YitongYoushiyun\resources\1.reg"

# 有关命令行参数的含义为:
# /L:sytem 指定 system.dat 文件的存放位置。
# /R:user 指定 user.dat 文件的存放位置。
# /E filename2 指定导出注册表文件的文件名。
# regpath 指定导出注册表文件的开始子键(缺省为全部子键)。
Regedit [/L:sytem] [/R:user] /E filename2 [regpath]

reg 命令

1
2
# 更多命令见参考资料
REG ADD "HKEY_LOCAL_MACHINE\Software\Classes\yts File\DxxxDefaultIcon" /ve /t REG_SZ /d "C:\Program Files\YitongYoushiyun\resources\file.ico"

node

child_process exec

1
2
3
4
5
6
7
const { exec } = require('child_process')
exec(cmdstr, {encoding: 'gbk'}, (err, stdout, stderr) => {
if (err) {
console.log('error', err)
}
console.log('success', stdout, stderr)
})

electron 使用 elevate.exe 执行以上命令

1
2
3
4
# reg
C:\Program Files\YitongYoushiyun\resources>elevate.exe REG ADD "HKEY_LOCAL_MACHINE\Software\Classes\yts File\DxxxDefaultIcon" /ve /t REG_SZ /d "C:\Program Files\YitongYoushiyun\resources\file.ico"
# regedit
C:\Program Files\YitongYoushiyun\resources>elevate.exe regedit /s "C:\Program Files\YitongYoushiyun\resources\1.reg"

child_process spawn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
const { spawn } = require('child_process')
const path = require('path')

async function _spawn(exe, args) {
return new Promise((resolve, reject) => {
try {
const process = spawn(exe, args, {
detached: true,
stdio: "ignore",
})
process.on("error", error => {
reject(error)
})
process.unref()
if (process.pid !== undefined) {
resolve(true)
}
}
catch (error) {
reject(error)
}
})
}
try {
_spawn(path.join("C:\\Program Files\\YitongYoushiyun\\resources", "/elevate.exe"), ['REG ADD', 'HKEY_LOCAL_MACHINE\Software\Classes\yts File\DDxXXXXXefaultIcon', '/ve', '/t', 'REG_SZ', '/d', 'C:\Program Files\YitongYoushiyun\resources\file.ico'])
.then((res) => {
console.log('==========================res', res)
}).catch((err) => {
console.error('==========================err', err)
})
} catch(err) {
console.log('err', err)
}

最终实现

1 双击xxx.reg能够正常写入注册表
2 通过reg、node命令执行会提示没有权限,写入失败
3 通过elevate.exe执行reg、node命令方式更新注册表,虽然提示成功,但注册表并没有更新
4 通过elevate.exe执行redegit命令成功写入

由于xxx.reg中部分参数是动态的,所以程序执行时动态生成.reg文件,通过4修改注册表

拓展

electron修改注册表获取管理员权限

1
2
3
4
5
6
7
8
9
10
const {Registry} = require('rage-edit')
const {app } = require('electron')
module.exports = (cbSus,cbErr)=>{
Registry.set(
'HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers',
app.getPath('exe'),
'~ RUNASADMIN',
'REG_SZ',
)
}

electron 开机启动

  1. electron自带
    app.setLoginItemSettings
    https://www.electronjs.org/docs/latest/api/app#appsetloginitemsettingssettings-macos-windows
  2. 注册表
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    const regedit = require('regedit');
    const { app } = require('electron');
    const path = require('path');

    // 开机自启动
    // 查看开机自启注册表是否已经注册electronApp
    regedit.list('HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run', (err, data) => {
    if (err) {
    console.log(err)
    }
    if (!data['HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run'].values.electronApp ||
    data['HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run'].values.electronApp !==
    app.getPath('exe')) { // 未注册或注册地址与现地址不一致则 进行注册
    regedit.putValue({
    'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run': {
    'electronApp': {
    value: app.getPath('exe'),
    type: 'REG_SZ'
    }
    }
    }, (error) => {
    if (error) console.log(error)
    })
    }
    });
  3. scheme
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    const regedit = require('regedit');
    const { app } = require('electron');
    /**
    * 下文中的`electronAPP`替换为自己需要的唤起名
    * 使用时直接在html中使用<a href='electronAPP://'>唤起app</a>
    */
    let url = app.getPath('exe'); // 获取可运行exe存放目录
    function setPath (url) {
    regedit.putValue({
    'HKLM\\SOFTWARE\\Classes\\electronAPP': { // 设置注册表url调用electronApp
    'defaule': {
    value: 'electronAPP', // 设置点击url的弹出框名字(表现不好)
    type: 'REG_DEFAULT'
    },
    'URL Protocol': {
    value: '',
    type: 'REG_SZ'
    },
    'path': {
    value: `${url}`,
    type: 'REG_SZ'
    }
    },
    'HKLM\\SOFTWARE\\Classes\\electronAPP\\shell\\open\\command': {
    'defaule': {
    value: `"${url}" "$1"`, // 需要唤起的应用程序路劲
    type: 'REG_DEFAULT'
    }
    }
    }, (putErr) => {
    console.log(putErr)
    })
    }
    if (url) { // 判断启动url是否正确(用户重新安装,并将安装目录修改)
    regedit.list('HKLM\\SOFTWARE\\Classes\\electronAPP', (listErr, docData) => {
    if (listErr) {
    regedit.createKey(['HKLM\\SOFTWARE\\Classes\\electronAPP\\shell\\open\\command'], (createErr) => {
    if (!createErr) {
    setPath(url)
    }
    })
    } else {
    if (docData['HKLM\\SOFTWARE\\Classes\\electronAPP'].values.path.value !== url) {
    setPath(url)
    }
    }
    })
    }

参考资料

nodejs
reg命令
FileAssociation.nsh
callUsingElevation
rage-edit
regedit
electron开启自启动


Electron修改注册表
http://example.com/20220622-修改注册表/
作者
csorz
发布于
2022年6月22日
许可协议