首页 > 解决方案 > 如何使用 Nodejs 和 spawn 在 Windows 10 上以管理员身份运行一些 CMD 命令?

问题描述

我在 Windows 10 上使用 Nodejs。每次打开应用程序时,我都想检查带有扩展名的文件ext是否与我的应用程序相关联。如果不是,我需要在 cmd 上运行此命令才能再次建立关联:

assoc .ext=CustomExt
ftype CustomExt=app.exe %1 %*

但我需要管理员权限才能完成这项工作。

我读过这个帖子Jeff M 准确地说出我想要实现的目标,但没有人回答他:

从可用性的角度来看,理想的情况是,只有当用户在我的节点程序中执行实际需要这些权限的操作时,才会提示用户提升权限。第二个最佳选择是当用户第一次启动节点程序时被提示提升权限。最不理想的情况是,如果根本没有提示用户,则由用户始终记住通过右键单击以管理员身份运行来启动程序。这是最不理想的,因为它给用户带来了记住始终以非典型方式启动程序的负担。

所以,回到我原来的问题,现在如果我尝试生成一个子进程,其中生成的程序需要提升的权限(我原始消息中的示例代码),当前的行为是不提示用户提供这些权限,而是节点程序因错误而崩溃。我怎样才能让我的节点程序请求这些特权而不是死掉?

我的nodejs脚本:

const { spawn } = require('child_process');

const assoc = spawn(                    // how to run this as admin privileges?
    'assoc',                            // command
    ['.ext=CustomExt'],                 // args
    {'shell': true }                    // options: run this into the shell
);

assoc.stdout.on('data', (buffer) => {
    var message = buffer.toString('utf8');
    console.log(message);
});

assoc.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`);
});

assoc.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
});

在 Nodejs 中创建扩展关联的任何其他方式也将受到赞赏。

2020 年 1 月 21 日更新

我相信 VSCode 可以做到这一点。所以我需要探索它的源代码来找到解决方案。现在在做其他项目,暂时没有时间研究。当一个文件应该以root权限保存时,会提示这样的消息,这正是我所需要的:

vscode 提示

2021 年 6 月 24 日更新

在 VSCode 问题中找到了一个有用的线程。使用sudo-prompt可能是解决方案。我还没有尝试过,但是依赖项仍然在 中package.json,所以看起来很有希望。

标签: node.jswindowscommandspawnelevated-privileges

解决方案


我知道它的旧帖子,但我遇到了这个问题并找到了一个替代解决方案,因此考虑分享。

  1. 创建一个 bat 文件,让我们使用您要运行的命令将其称为 disabletask.bat,例如在 TaskScheduler "SCHTASKS.EXE /change /disable /TN "Test" 中禁用任务

  2. 在以最高权限运行的 TaskScheduler 中创建一个任务,请参见图像中的复选框

    图像

  3. 使用 Nodejs 执行此任务

        var child_process = require('child_process');
        child_process.exec('SCHTASKS.EXE /RUN /TN "disabletask"', function(error, stdout, stderr) {
            console.log(stdout);
        });
    
    

推荐阅读