在Go中执行vbscript

 admin 发布于 2023-02-13 11:45

我试图让Go程序执行一个添加几个注册表值的vbscript.处理此问题的Go代码如下:

err = exec.Command("cmd.exe", "/c", "registry.vbs").Run()
if err != nil {
    fmt.Printf("Error: %s\n", err.Error())
}

当我运行我的Go程序并且它到达执行此vbscript的部分时,绝对没有任何反应.注册表值不会更改,也不会出现错误.如果我尝试运行以下命令它可以正常工作:

cmd.exe /c C:\path\to\file\registry.vbs

我尝试过的事情:

在Go程序中添加文件路径

以管理员身份运行Go程序

我尝试使用.Output()而不是,.Run()这导致输出等于[ ]

有人知道为什么会这样吗?

任何方向将不胜感激.

1 个回答
  • 你的场景中有很多东西可能出错,你应该从简单开始:

    (1)给出一个尝试更改注册表的.vbs (Windows急切地保护):

    MsgBox "ThatsMe"
    

    和调用

    err := exec.Command("cmd.exe", "/c", "ThatMe.vbs").Run()
    

    从同一文件夹中的.exe,我得到一个安全警报:"你真的想从映射的网络驱动器E:\"打开ThatsMe.vbs.如果我同意,则执行脚本并显示MsgBox.您的安全设置可能非常严格,甚至不会被问到.

    (2)对于上面的调用,shell必须知道如何处理.VBS文件.您的assoc/ftype设置可能不提供此信息.然后

    err := exec.Command("wscript.exe", "ThatsMe.vbs").Run()
    

    要么

    err := exec.Command("cscript.exe", "ThatsMe.vbs").Run()
    

    应该工作 - 有趣的是没有安全警告.

    (3)不是依赖于PATH并且在同一文件夹中执行/执行所有文件/工作,而是提出完整的文件规范可能是一个好主意:

    err := exec.Command(
        "C:/WINDOWS/system32/wscript.exe",
        "E:/trials/SoTrials/answers/10024850/go/ThatsMe.vbs").Run()
    

    (4)如果您可以执行简陋的ThatsMe.vbs,但您的registry.vbs仍然失败,那么您必须研究谁可以查看/更改您感兴趣的注册表部分.也许您必须调用您的可执行文件作为管理员.

    (5)在进行实验时,我从Go获得了相当不错的错误消息,用于我尝试的(非)预期的令人讨厌的东西(使用%comspec%而不是cmd.exe,错误的文件规范,......).但是,尝试读取不存在的注册表项会导致Windows脚本主机错误弹出,并且没有 Go错误.所以你的"绝对没有发生"的诊断让我想知道,Windows是否隐藏了你的错误信息.IExplorer高级设置中有一些黑暗选项,如"显示有关每个脚本错误的通知".

    2023-02-13 11:47 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有