作者:虛情徦噫d_951 | 来源:互联网 | 2023-07-31 19:26
tasklist远程获取进程报错账号密码错误问题描述:写了一个监控程序,需要远程获取windows系统下某个进程是否在运行?因为业务需要这个程序需要注冊为windows服务(如果直
tasklist 远程获取进程报错账号密码错误
问题描述:写了一个监控程序,需要远程获取 windows 系统下某个进程是否在运行?因为业务需要这个程序需要注冊为 windows 服务(如果直接命令行执行,可能其他人会误操作推出程序,很多人同时会用这服务器)。
服务注冊用的是 github.com/kardianos/service 包。
执行命令的部分代码
args := []string{"/C", "tasklist", "/s", "127.0.0.1", "/u", "Administrator", "/p", "password", "/fi", "IMAGENAME eq ****.exe"}
cmd := exec.Command("cmd.exe", args...)
logger.Info(fmt.Sprintf("%+v", cmd))
var out bytes.Buffer
var outErr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &outErr
if err := cmd.Run(); err != nil {
utf8Data := outErr.Bytes()
if isGBK(outErr.Bytes()) {
utf8Data, _ = simplifiedchinese.GBK.NewDecoder().Bytes(outErr.Bytes())
logger.Info(fmt.Sprintf("outErr isUtf8 %v", isUtf8(utf8Data)))
}
logger.Info(fmt.Sprintf("outErr isGBK %v", isGBK(outErr.Bytes())))
logger.Info(fmt.Sprintf("outErr isUtf8 %v", isUtf8(outErr.Bytes())))
logger.Info(fmt.Sprintf("tasklist %v", string(utf8Data)))
}
logger.Info(fmt.Sprintf("out isGBK %v", isGBK(out.Bytes())))
logger.Info(fmt.Sprintf("out isUtf8 %v", isUtf8(out.Bytes())))
logger.Info(fmt.Sprintf("%v", out.String()))
logger.Info("info app count", zap.Int("count:", strings.Count(out.String(), "*****.exe")))
返回信息大致是这样,乱码部分转码后为账号或密码错误。
明明账号密码都没问题,直接命令行执行都是正常的,这情况真的是有点摸不着头脑。
看了一遍 github.com/kardianos/service 的源码,发现注冊服务是可以设置服务的运行用户的。
type Config struct {
Name string
DisplayName string
Description string
UserName string
Arguments []string
Executable string
Dependencies []string
WorkingDirectory string
ChRoot string
Option KeyValue
}
经过尝试之后,账号密码还是没有生效。在 issues 里面,也没找到什么有用的信息。
正在我一筹莫展之际,我突然想起 windows 服务在注冊好之后是可以设置账号密码的:
一顿操作重启服务,果然服务可以正常执行了。
问题解决,今天又是愉快的一天!!
golang
windows
tasklist
命令行