Вызов appcmd приводит к установке неправильного пароля - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь вызвать appcmd изнутри Go. Приведенный ниже код показывает успех, но установлен неправильный пароль. Если я удалю внутренние кавычки (во второй строке main), он будет работать, но тогда он не будет работать, если пароль содержит пробелы! Теперь С кавычками, если я наберу cmd.exe команду точно так, как она выводит, она работает! Так что, черт возьми! Почему он работает с кавычками непосредственно в cmd, но не при вызове из Go?

Я действительно не хочу быть тем парнем, который говорит, что вы не можете использовать пробелы в паролях, потому что я не могу выяснить, почему это не работает! УГХ!

package main

import (
    "bytes"
    "fmt"
    "os/exec"
    "strconv"
    "strings"
    "syscall"
)

func main() {
    iisPath := "C:\\WINDOWS\\sysWOW64\\inetsrv\\"
    callAppcmd(iisPath, "-processModel.password:\"password\"")
}

func callAppcmd(iisPath string, param string) {
    stdOut, _, _, exitCode := runCommand(
        iisPath+"appcmd.exe",
        "set",
        "apppool",
        "/apppool.name:DefaultAppPool",
        param)

    printOut(stdOut)
    printOut(strconv.Itoa(exitCode))
}

func printOut(text string) {
    fmt.Println(text)
}

func runCommand(commands ...string) (string, string, error, int) {
    printOut(strings.Join(commands, " "))
    cmd := exec.Command(commands[0], commands[1:]...)
    cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err := cmd.Run()

    exitCode := 0

    if exitError, ok := err.(*exec.ExitError); ok {
        exitCode = exitError.ExitCode()
    }

    return out.String(), stderr.String(), err, exitCode
}

Вывод:

C:\WINDOWS\sysWOW64\inetsrv\appcmd.exe set apppool /apppool.name:DefaultAppPool -processModel.password:"password"
APPPOOL object "DefaultAppPool" changed

0

1 Ответ

1 голос
/ 07 августа 2020

Кажется, что форматирование строки с помощью обратных кавычек является решением этой проблемы, которое не будет выполнять автоматическое c экранирование и может правильно обрабатывать кавычки.

cmd := exec.Command(`find`)
cmd.SysProcAttr.CmdLine = `find "SomeText" test.txt`

См. Ссылку ниже. exe c с аргументом в двойных кавычках

...