Commit d6cacfef by 陶腾飞

2022-04-04

parent b9e5176d
...@@ -2,8 +2,6 @@ test/ ...@@ -2,8 +2,6 @@ test/
testwalk/ testwalk/
testmain/ testmain/
exe/ exe/
pkg/
catHardware/
.vscode/ .vscode/
*.bat *.bat
*.ps1 *.ps1
......
...@@ -43,7 +43,6 @@ ...@@ -43,7 +43,6 @@
> 3. 主机唤醒 > 3. 主机唤醒
> 4. 同步cmdb > 4. 同步cmdb
> 5. 硬件信息收集 > 5. 硬件信息收集
> 6. 获取token
## 三、[cmdb](http://cmdb.zhiweidata.top/instances/types/28) ## 三、[cmdb](http://cmdb.zhiweidata.top/instances/types/28)
...@@ -83,6 +82,7 @@ ...@@ -83,6 +82,7 @@
- 2022/03/29 v2.0.0 删除备份策略,同步域计算机信息到cmdb,添加账户、主机管理管理,唤醒策略更新,日志统一收集处理,运维平台添加管理员指令 - 2022/03/29 v2.0.0 删除备份策略,同步域计算机信息到cmdb,添加账户、主机管理管理,唤醒策略更新,日志统一收集处理,运维平台添加管理员指令
- 2022/03/30 v2.1.0 支持通过cmdb获取字段来唤醒主机,日志输出优化,支持通过运维平台打开远程终端 - 2022/03/30 v2.1.0 支持通过cmdb获取字段来唤醒主机,日志输出优化,支持通过运维平台打开远程终端
- 2022/03/31 v2.2.0 知微运维平台功能完善,修复cmdb的位置错误问题,修复用户会属于多个主要计算机的问题,修复内存条DDR4无法显示的问题,清除扫描硬盘出现U盘的情况 - 2022/03/31 v2.2.0 知微运维平台功能完善,修复cmdb的位置错误问题,修复用户会属于多个主要计算机的问题,修复内存条DDR4无法显示的问题,清除扫描硬盘出现U盘的情况
- 2022/04/04 v2.2.1 修复远程管理主机失败的问题,增加对操作系统的判断、为Cmdb Automatic Update Tool的自动更新工具(专用于非情报部门的主机的cmdb同步工具)做铺垫。
## 五、其他说明 ## 五、其他说明
......
...@@ -2,6 +2,7 @@ package main ...@@ -2,6 +2,7 @@ package main
import ( import (
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
"encoding/json" "encoding/json"
"flag" "flag"
"fmt" "fmt"
...@@ -24,7 +25,6 @@ func main() { ...@@ -24,7 +25,6 @@ func main() {
var wolHostText = flag.String("wolhost", "", "input hostname for waking pc") var wolHostText = flag.String("wolhost", "", "input hostname for waking pc")
var wolAllText = flag.Bool("wolall", false, "wake all Domain Computer") var wolAllText = flag.Bool("wolall", false, "wake all Domain Computer")
var hourText = flag.Bool("hour", false, "exec task at the time") var hourText = flag.Bool("hour", false, "exec task at the time")
var cmdbtokenText = flag.Bool("cmdbtoken", false, "")
var loglevel = flag.String("loglevel", INFO, "") var loglevel = flag.String("loglevel", INFO, "")
var force = flag.Bool("force", false, "force exec,ignore other") var force = flag.Bool("force", false, "force exec,ignore other")
var quick = flag.Bool("quick", false, "quickly exec") var quick = flag.Bool("quick", false, "quickly exec")
...@@ -57,9 +57,6 @@ func main() { ...@@ -57,9 +57,6 @@ func main() {
pub.DomainCotroller() pub.DomainCotroller()
wolALL() wolALL()
} else if *cmdbtokenText {
pub.DomainCotroller()
pub.CmdbTokenUpdate()
} }
return return
} }
......
package main
import (
pub "AD-Control-Golang/public"
reg "AD-Control-Golang/registry"
"encoding/json"
"fmt"
"time"
)
const reg_cmdb_token = "cmdb_token"
func messionloop() {
ticker := time.NewTicker(3600 * time.Second)
defer ticker.Stop()
// 若通道为空,则阻塞
// 若通道有数据,则读取
// 若通道关闭,则退出
for range ticker.C {
setCMDBToken()
}
}
func setCMDBToken() bool {
type res struct {
Token string `json:"token"`
}
var r res
cmdbPath := "api/login"
url := fmt.Sprintf("%s/%s", reg.Query_DC("cmdb_url"), cmdbPath)
cmdbPass := fmt.Sprintf(`{"password":"%s","username":"%s"}`, reg.Query_DC("cmdb_tp"), reg.Query_DC("cmdb_tu"))
data, err := pub.CmdbPOST(url, []byte(cmdbPass))
msg_type := "CMDB_TOKEN"
if err != nil {
pub.LOG(ERROR, msg_type, err)
return false
}
if err := json.Unmarshal(data, &r); err != nil {
pub.LOG(ERROR, msg_type, err)
return false
}
pub.LOG(INFO, msg_type, string(r.Token))
reg.Write_DC(reg_cmdb_token, string(r.Token))
pub.Reg_cmdb_token = string(r.Token)
return true
}
...@@ -2,6 +2,7 @@ package main ...@@ -2,6 +2,7 @@ package main
import ( import (
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
reg "AD-Control-Golang/registry"
"net" "net"
"net/http" "net/http"
"os" "os"
...@@ -9,9 +10,33 @@ import ( ...@@ -9,9 +10,33 @@ import (
var l *os.File var l *os.File
const INFO = pub.INFO
const ERROR = pub.ERROR
const NULL = pub.NULL
//pub.Loglevel = pub.DEBUG
func mainInit() {
if !pub.DomainCotroller() && pub.Windows() && !setCMDBToken() {
os.Exit(-1)
}
l, _ = os.OpenFile(pub.User_userprofile+`\users.log`, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
pub.WxworkBotLink = reg.Query_DC("WxworkBotLink")
pub.WxworkTokenMsgSend = reg.Query_DC("WxworkTokenMsgSend")
pub.WxworkEncodingAseKey = reg.Query_DC("WxworkEncodingAseKey")
pub.WxworkReceiverId = reg.Query_DC("WxworkReceiverId")
pub.WxworkCorid = reg.Query_DC("WxworkCorid")
pub.WxworkCorpSecret = reg.Query_DC("WxworkCorpSecret")
pub.WxWorkAgentID = reg.Query_DC("WxworkAgentID")
pub.AD_User_ADControl = reg.Query_DC("ADControl")
pub.AD_User_ADControl_key = reg.Query_DC("ADControl_key")
pub.CmdbUrl = reg.Query_DC("cmdb_url")
pub.CmdbCITypeComputer = reg.Query_DC("cmdb_CITypeComputer")
}
func main() { func main() {
l, _ = os.OpenFile(`H:\logs\users.log`, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766) mainInit()
//pub.Loglevel = pub.DEBUG go messionloop()
go listenLog() go listenLog()
listenMsg() listenMsg()
...@@ -19,7 +44,6 @@ func main() { ...@@ -19,7 +44,6 @@ func main() {
func listenMsg() { func listenMsg() {
pub.LOG(pub.INFO, pub.NULL, "start MSG daemon!") pub.LOG(pub.INFO, pub.NULL, "start MSG daemon!")
http.HandleFunc("/", pub.DealMsgEnter) http.HandleFunc("/", pub.DealMsgEnter)
http.ListenAndServe(pub.DaemonListen, nil) http.ListenAndServe(pub.DaemonListen, nil)
} }
......
...@@ -8,10 +8,10 @@ import ( ...@@ -8,10 +8,10 @@ import (
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"net/url" "net/url"
"strings"
) )
var client = http.Client{} var client = http.Client{}
var Reg_cmdb_token string
func getVFromK(cir *CIRecordResult, k string) string { func getVFromK(cir *CIRecordResult, k string) string {
var r string var r string
...@@ -66,7 +66,7 @@ func cmdbExistRecord(k, v string) (int, bool) { ...@@ -66,7 +66,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
var cmdbPath string = "api/v0.1/ci/s?q=" var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(k, v) v = cmdbChineseURL(k, v)
search := fmt.Sprintf("%s:%s", k, v) search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count) url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", CmdbUrl, cmdbPath, CmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
var cir CIRecordReq var cir CIRecordReq
data, err := cmdbGET(url) data, err := cmdbGET(url)
...@@ -89,7 +89,7 @@ func cmdbExistRecord(k, v string) (int, bool) { ...@@ -89,7 +89,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
} }
cir.Uni_one = fmt.Sprintf("%v", NowTimestampNano()) cir.Uni_one = fmt.Sprintf("%v", NowTimestampNano())
cmdbPath = "api/v0.1/ci" cmdbPath = "api/v0.1/ci"
url = fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath) url = fmt.Sprintf("%s/%s", CmdbUrl, cmdbPath)
jsondata, jsonerr := cir.String() jsondata, jsonerr := cir.String()
LOG(DEBUG, "CMDB_NEW", fmt.Sprintf("路径:%s\n参数:%s", url, string(jsondata))) LOG(DEBUG, "CMDB_NEW", fmt.Sprintf("路径:%s\n参数:%s", url, string(jsondata)))
...@@ -98,7 +98,7 @@ func cmdbExistRecord(k, v string) (int, bool) { ...@@ -98,7 +98,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
return 0, false return 0, false
} }
if _, err := cmdbPOST(url, jsondata); err != nil { if _, err := CmdbPOST(url, jsondata); err != nil {
LOG(ERROR, CMDB, err) LOG(ERROR, CMDB, err)
return 0, false return 0, false
} else { } else {
...@@ -120,7 +120,7 @@ func cmdbExistRecord(k, v string) (int, bool) { ...@@ -120,7 +120,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
func cmdbUpdateRecordFromJSON(datastr string, ci int) error { func cmdbUpdateRecordFromJSON(datastr string, ci int) error {
var cmdbPath string = fmt.Sprintf("api/v0.1/ci/%d", ci) var cmdbPath string = fmt.Sprintf("api/v0.1/ci/%d", ci)
url := fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath) url := fmt.Sprintf("%s/%s", CmdbUrl, cmdbPath)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
data, err := cmdbPUT(url, []byte(datastr)) data, err := cmdbPUT(url, []byte(datastr))
...@@ -139,34 +139,6 @@ func cmdbUpdateRecordFromJSON(datastr string, ci int) error { ...@@ -139,34 +139,6 @@ func cmdbUpdateRecordFromJSON(datastr string, ci int) error {
return nil return nil
} }
// 获取token并保存于注册表
func CmdbTokenUpdate() {
type res struct {
Token string `json:"token"`
}
var r res
msg_type := CMDB + "_TOKEN"
cmdbPath := "api/login"
url := fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath)
LOG(DEBUG, CMDB, url)
data, err := cmdbPOST(url, []byte(cmdbPass))
if err != nil {
LOG(ERROR, msg_type, err)
return
}
if err := json.Unmarshal(data, &r); err != nil {
LOG(ERROR, msg_type, err)
return
}
if len(r.Token) == 0 {
LOG(ERROR, msg_type, "token获取失败")
} else {
Reg_Write_DC(Reg_Key_cmdbtoken, string(r.Token))
LOG(INFO, msg_type, "token更新完成")
}
}
// 根据键值获取CI // 根据键值获取CI
func cmdbGetCI(k, v string) (int, error) { func cmdbGetCI(k, v string) (int, error) {
...@@ -174,7 +146,7 @@ func cmdbGetCI(k, v string) (int, error) { ...@@ -174,7 +146,7 @@ func cmdbGetCI(k, v string) (int, error) {
var cmdbPath string = "api/v0.1/ci/s?q=" var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(k, v) v = cmdbChineseURL(k, v)
search := fmt.Sprintf("%s:%s", k, v) search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count) url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", CmdbUrl, cmdbPath, CmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
var cir CIRecordReq var cir CIRecordReq
data, err := cmdbGET(url) data, err := cmdbGET(url)
...@@ -204,7 +176,7 @@ func CmdbRecordValueClear(k, v string) error { ...@@ -204,7 +176,7 @@ func CmdbRecordValueClear(k, v string) error {
var cmdbPath string = "api/v0.1/ci/s?q=" var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(k, v) v = cmdbChineseURL(k, v)
search := fmt.Sprintf("%s:%s", k, v) search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search) url := fmt.Sprintf("%s/%s_type:%s,%s", CmdbUrl, cmdbPath, CmdbCITypeComputer, search)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
var cir CIRecordReq var cir CIRecordReq
...@@ -241,7 +213,7 @@ func CmdbGetWordFromKV(k, v, w string) (string, error) { ...@@ -241,7 +213,7 @@ func CmdbGetWordFromKV(k, v, w string) (string, error) {
var cmdbPath string = "api/v0.1/ci/s?q=" var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(k, v) v = cmdbChineseURL(k, v)
search := fmt.Sprintf("%s:%s", k, v) search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count) url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", CmdbUrl, cmdbPath, CmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
var cir CIRecordReq var cir CIRecordReq
data, err := cmdbGET(url) data, err := cmdbGET(url)
...@@ -274,7 +246,7 @@ func CmdbGetWordFromKV2(k, v, a, b string) (string, string, error) { ...@@ -274,7 +246,7 @@ func CmdbGetWordFromKV2(k, v, a, b string) (string, string, error) {
v = cmdbChineseURL(k, v) v = cmdbChineseURL(k, v)
search := fmt.Sprintf("%s:%s", k, v) search := fmt.Sprintf("%s:%s", k, v)
url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", cmdbUrl, cmdbPath, cmdbCITypeComputer, search, count) url := fmt.Sprintf("%s/%s_type:%s,%s&count=%s", CmdbUrl, cmdbPath, CmdbCITypeComputer, search, count)
LOG(DEBUG, CMDB, url) LOG(DEBUG, CMDB, url)
var cir CIRecordReq var cir CIRecordReq
data, err := cmdbGET(url) data, err := cmdbGET(url)
...@@ -299,7 +271,7 @@ func CmdbGetWordFromKV2(k, v, a, b string) (string, string, error) { ...@@ -299,7 +271,7 @@ func CmdbGetWordFromKV2(k, v, a, b string) (string, string, error) {
} }
} }
func cmdbPOST(url string, reqdata []byte) ([]byte, error) { func CmdbPOST(url string, reqdata []byte) ([]byte, error) {
buf := bytes.NewBuffer(nil) buf := bytes.NewBuffer(nil)
buf.Write(reqdata) buf.Write(reqdata)
h, err := http.NewRequest("POST", url, buf) h, err := http.NewRequest("POST", url, buf)
...@@ -310,9 +282,10 @@ func cmdbPOST(url string, reqdata []byte) ([]byte, error) { ...@@ -310,9 +282,10 @@ func cmdbPOST(url string, reqdata []byte) ([]byte, error) {
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新 // 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token // 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 { // if strings.Index(url, "api/login") == -1 {
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken)) // h.Header.Add("Access-Token", CmdbPass)
} // }
h.Header.Add("Access-Token", Reg_cmdb_token)
res, err := (&client).Do(h) res, err := (&client).Do(h)
if err != nil { if err != nil {
...@@ -342,9 +315,7 @@ func cmdbPUT(url string, reqdata []byte) ([]byte, error) { ...@@ -342,9 +315,7 @@ func cmdbPUT(url string, reqdata []byte) ([]byte, error) {
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新 // 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token // 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 { h.Header.Add("Access-Token", Reg_cmdb_token)
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken))
}
res, err := (&client).Do(h) res, err := (&client).Do(h)
if err != nil { if err != nil {
......
...@@ -58,20 +58,6 @@ type CIRecordStartup struct { ...@@ -58,20 +58,6 @@ type CIRecordStartup struct {
Disk string `json:"disk"` // 硬盘 Disk string `json:"disk"` // 硬盘
Memory string `json:"memory"` // 内存 Memory string `json:"memory"` // 内存
} }
type CIRecord struct {
Bumen string `json:"bumen"` // 部门
Username string `json:"username"` // 姓名
Position string `json:"position"` // 具体位置
Seat string `json:"seat"` // 主机座位坐标
Product_name string `json:"product_name"` // 主机名
Ip string `json:"ip"` // ip
Mac string `json:"mac"` // mac地址
Start_time string `json:"start_time"` // 启动时间
Shutdown_time string `json:"shutdown_time"` // 关机时间
Cpu string `json:"cpu"` // cpu
Disk string `json:"disk"` // 硬盘
Memory string `json:"memory"` // 内存
}
type CIRecordUpdateReq struct { type CIRecordUpdateReq struct {
Ci_id int `json:"ci_id"` Ci_id int `json:"ci_id"`
} }
...@@ -98,7 +84,7 @@ func (cir *CIRecordResult) BasicInfo(v string) error { ...@@ -98,7 +84,7 @@ func (cir *CIRecordResult) BasicInfo(v string) error {
return fmt.Errorf("主机命令错误") return fmt.Errorf("主机命令错误")
} }
cir.Seat = hostnameSplit[2] cir.Seat = hostnameSplit[2]
cir.Ci_type = cmdbCITypeComputer cir.Ci_type = CmdbCITypeComputer
return err return err
} }
func (cir *CIRecordStartup) GetHardWare() { func (cir *CIRecordStartup) GetHardWare() {
...@@ -198,7 +184,7 @@ func (cir *CIRecordStartup) GetDept() (string, error) { ...@@ -198,7 +184,7 @@ func (cir *CIRecordStartup) GetDept() (string, error) {
result = "金融组" result = "金融组"
case "TXHD": case "TXHD":
result = "腾讯互动组" result = "腾讯互动组"
case "TXMT": case "TXWJ":
result = "腾讯危机组" result = "腾讯危机组"
case "JS": case "JS":
result = "技术组" result = "技术组"
......
package public package public
// os //
var OS_Type = getOSType()
// other // // other //
var Active bool = true var Active bool = true
...@@ -8,28 +11,20 @@ const SymbolHostname = "-" ...@@ -8,28 +11,20 @@ const SymbolHostname = "-"
// AD-Control // // AD-Control //
const Version string = "2.2.0" const Version string = "2.2.1"
const Host_adserver string = "ADSERVER" const Host_adserver string = "ADSERVER"
const Host_adserver_ip string = "192.168.0.20"
const Host_thserver string = "THSERVER" const Host_thserver string = "THSERVER"
const Host_zzserver string = "ZZSERVER" const Host_zzserver string = "ZZSERVER"
const DaemonListen string = ":16823" const DaemonListen string = ":16823"
const DaemonLogListen string = ":16824" const DaemonLogListen string = ":16824"
const ADServerDaemon string = Host_adserver + DaemonListen
const ADServerLogDaemon string = Host_adserver + DaemonLogListen
const THServerDaemon string = Host_thserver + DaemonListen
//
//
// AD User env //
//
const AD_User_main_admin string = "zhiweiadserver" var ADServerDaemon string = Host_adserver + DaemonListen
const AD_User_tengfei string = "tengfei" var ADServerLogDaemon string = Host_adserver + DaemonLogListen
const AD_User_taotengfei string = "taotengfei" var THServerDaemon string = Host_thserver + DaemonListen
const AD_User_ADControl string = "ad-control@zhiweireach.com"
const AD_User_ADControl_key string = "golang&*90-="
// users // // users //
const Users_Timeout int = 3 const Users_Timeout int = 3
// user // // user //
...@@ -37,11 +32,11 @@ const Users_Timeout int = 3 ...@@ -37,11 +32,11 @@ const Users_Timeout int = 3
var User_computername string = GetEnv("COMPUTERNAME") var User_computername string = GetEnv("COMPUTERNAME")
var User_homeshare string = GetEnv("HOMESHARE") var User_homeshare string = GetEnv("HOMESHARE")
var User_userdomain string = GetEnv("USERDOMAIN") var User_userdomain string = GetEnv("USERDOMAIN")
var User_userprofile string = GetEnv("USERPROFILE")
var User_name string = GetEnv("USERNAME") var User_name string = GetEnv("USERNAME")
var User_tmp string = GetEnv("tmp") var User_tmp string = GetEnv("tmp")
var User_sid string = reg_query_key_one(HKCU, `Software\Microsoft\Windows\CurrentVersion\FileAssociations`, "UserSid")
var User_sessionID string = Reg_query_item_one(HKU, User_sid+`\Volatile Environment`)
var User_name_display string = GetEnvFqdn("CN") var User_name_display string = GetEnvFqdn("CN")
var User_logonserver string = GetEnv("LOGONSERVER")
// SMB Folder// // SMB Folder//
...@@ -71,32 +66,31 @@ const ( ...@@ -71,32 +66,31 @@ const (
HKU HKU
) )
// reg value //
const reg_LM_ADCONTROL string = `software\AD-Control`
const Reg_Key_cmdbtoken string = "cmdb_token" const Reg_Key_cmdbtoken string = "cmdb_token"
const Reg_Value_ON string = "ON" const Reg_Value_ON string = "ON"
const Reg_Value_OFF string = "OFF" const Reg_Value_OFF string = "OFF"
// other // // other //
const Link_WxworkBot string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
const Cmd_c string = "cmd /c " const Cmd_c string = "cmd /c "
const Cmd_k string = "cmd /k " const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start " const Cmd_K_Start string = "cmd /k start "
// wxwork key // // wxwork key //
const WxworkTokenMsgSend string = "AvAQlFNxy1UQB3CjRml3GfKf7Y" var WxworkBotLink string
const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy" var WxworkTokenMsgSend string
const WxworkReceiverId string = "ww49cfd580625083c9" var WxworkEncodingAseKey string
const WxworkCorid string = "ww49cfd580625083c9" var WxworkReceiverId string
const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I" var WxworkCorid string
const WxWorkAgentID string = "1000014" var WxworkCorpSecret string
var WxWorkAgentID string
// log level // // log level //
var Loglevel string = INFO var Loglevel string = INFO
const INFO string = "info" const INFO string = "info"
const WARN string = "warn"
const ERROR string = "error" const ERROR string = "error"
const DEBUG string = "debug" const DEBUG string = "debug"
const NULL string = "" const NULL string = ""
...@@ -105,6 +99,7 @@ const NULL string = "" ...@@ -105,6 +99,7 @@ const NULL string = ""
const CMDB string = "cmdb" const CMDB string = "cmdb"
// cmdb // // cmdb //
const cmdbUrl string = "http://192.168.0.21:5000" var CmdbUrl string
const cmdbCITypeComputer string = "28" var CmdbCITypeComputer string
const cmdbPass string = `{"password":"3f7eba3920866b2c2375ba61117c42bf","username":"tengfei"}` var AD_User_ADControl string
var AD_User_ADControl_key string
...@@ -19,8 +19,7 @@ var Error_Fail_Token = errors.New("Get Token Fail") ...@@ -19,8 +19,7 @@ var Error_Fail_Token = errors.New("Get Token Fail")
var Error_Fail_File_Write = errors.New("Fail File Write") var Error_Fail_File_Write = errors.New("Fail File Write")
var Error_Not_Msg = errors.New("isn't defined msg") var Error_Not_Msg = errors.New("isn't defined msg")
var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR) var Error_WXWork_Down = errors.New(Error_WXWork_Fail_ReTry)
var Error_WXWork_Down_STR = "后台更新中..."
var Error_WXWork_Fail_ReTry = "后台错误,稍后重试!" var Error_WXWork_Fail_ReTry = "后台错误,稍后重试!"
const Error_CMDB_UPDATE_REQ = "更新失败" const Error_CMDB_UPDATE_REQ = "更新失败"
......
...@@ -41,11 +41,11 @@ func logDeal(level string, l *logs) { ...@@ -41,11 +41,11 @@ func logDeal(level string, l *logs) {
if err != nil { if err != nil {
SendWxworkTextToAdmins(err.Error()) SendWxworkTextToAdmins(err.Error())
} }
if DomainComputer() || !Zhiweireach() {
if DomainComputer() {
SendLog(string(textbyte)) SendLog(string(textbyte))
return return
} }
if DomainCotroller() { if DomainCotroller() {
switch level { switch level {
// 绿色 // 绿色
...@@ -64,7 +64,7 @@ func logDeal(level string, l *logs) { ...@@ -64,7 +64,7 @@ func logDeal(level string, l *logs) {
return return
} }
} }
func LOG(level string, msgtype string, args ...interface{}) { func LOG(level string, msgtype string, args ...any) {
if (Loglevel != DEBUG) && (level == DEBUG) { if (Loglevel != DEBUG) && (level == DEBUG) {
return return
} }
...@@ -72,6 +72,6 @@ func LOG(level string, msgtype string, args ...interface{}) { ...@@ -72,6 +72,6 @@ func LOG(level string, msgtype string, args ...interface{}) {
l.Host = User_computername l.Host = User_computername
l.Level = level l.Level = level
l.MsgType = msgtype l.MsgType = msgtype
l.Message = fmt.Sprint(fmt.Sprint(args...)) l.Message = fmt.Sprint(args...)
logDeal(level, &l) logDeal(level, &l)
} }
...@@ -81,7 +81,7 @@ func (rep *MJreport) MsgDeal() interface{} { ...@@ -81,7 +81,7 @@ func (rep *MJreport) MsgDeal() interface{} {
LOG(INFO, rep.Instruction, rep.Computername) LOG(INFO, rep.Instruction, rep.Computername)
} }
} }
// 客户端处理 // 客户端
case Msg_status_deal: case Msg_status_deal:
return nil return nil
} }
...@@ -141,7 +141,7 @@ func (rep *MJreport) MsgDeal() interface{} { ...@@ -141,7 +141,7 @@ func (rep *MJreport) MsgDeal() interface{} {
// 客户端 // 客户端
case Msg_status_deal: case Msg_status_deal:
if rep.DataStr != "" { if rep.DataStr != "" {
Msg(rep.DataStr) MsgBox(rep.DataStr)
} }
} }
default: default:
...@@ -172,7 +172,7 @@ func (exec *MJexec) MsgDeal() interface{} { ...@@ -172,7 +172,7 @@ func (exec *MJexec) MsgDeal() interface{} {
exec.Status = Msg_Exec_State_Over exec.Status = Msg_Exec_State_Over
case Msg_Exec_State_Over: case Msg_Exec_State_Over:
if exec.IfMsg { if exec.IfMsg {
Msg(exec.Explain) MsgBox(exec.Explain)
} }
return nil return nil
} }
...@@ -274,7 +274,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -274,7 +274,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, mac, err = CmdbGetWordFromKV2(Cmdb_Username, wxwork.Name, Cmdb_Product_name, Cmdb_Mac) pc, mac, err = CmdbGetWordFromKV2(Cmdb_Username, wxwork.Name, Cmdb_Product_name, Cmdb_Mac)
switch err { switch err {
case Error_CMDB_No_Record: case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`) wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return return
case nil: case nil:
break break
...@@ -329,7 +329,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -329,7 +329,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name) pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err { switch err {
case Error_CMDB_No_Record: case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`) wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return return
case nil: case nil:
break break
...@@ -352,7 +352,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -352,7 +352,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name)) LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name))
if err := PowerRestartForNow(pc); err != nil { if err := RestartPCForNow(pc); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
wxwork.SendText(Error_WXWork_Fail_ReTry) wxwork.SendText(Error_WXWork_Fail_ReTry)
return return
...@@ -390,7 +390,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -390,7 +390,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name) pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err { switch err {
case Error_CMDB_No_Record: case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`) wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return return
case nil: case nil:
break break
...@@ -413,7 +413,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -413,7 +413,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name)) LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name))
if err := PowerShutdownForNow(pc); err != nil { if err := ShutdownPCForNow(pc); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
wxwork.SendText(Error_WXWork_Fail_ReTry) wxwork.SendText(Error_WXWork_Fail_ReTry)
return return
...@@ -447,7 +447,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -447,7 +447,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name) pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err { switch err {
case Error_CMDB_No_Record: case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`) wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return return
case nil: case nil:
break break
...@@ -459,11 +459,11 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -459,11 +459,11 @@ func (wxwork *MJwxwork) MsgDealSend() {
// 检查 主机连接情况 // 检查 主机连接情况
status, err := PSTest_Connection(pc) status, err := PSTest_Connection(pc)
if err != nil { if err != nil {
wxwork.Result = Error_WXWork_Down_STR wxwork.Result = Error_WXWork_Fail_ReTry
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
break break
} }
LOG(INFO, "Wxwork_Rec", fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name)) LOG(INFO, WXEK_zwDevopsPowerStatus, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name))
if status { if status {
wxwork.Result = "主机已启动" wxwork.Result = "主机已启动"
......
...@@ -171,32 +171,31 @@ func (rep *MJreport) init(Report string) { ...@@ -171,32 +171,31 @@ func (rep *MJreport) init(Report string) {
// Exec // Exec
func GJexec(s string) MJexec { func GJexec(s, id string) MJexec {
var exec MJexec var exec MJexec
exec.Init(s) exec.Init(s, id)
return exec return exec
} }
func GJexecInstallSoftware(s string) interface{} { func GJexecInstallSoftware(s, id string) interface{} {
var exec MJexec var exec MJexec
exec.Init(s) exec.Init(s, id)
exec.Instruction = Msg_Exec_InstallSoftware exec.Instruction = Msg_Exec_InstallSoftware
exec.Command = s exec.Command = s
return exec return exec
} }
func GJexecDIYFlag(flag, command string) MJexec { func GJexecDIYFlag(flag, command, id string) MJexec {
var exec MJexec var exec MJexec
exec.Init(flag) exec.Init(flag, id)
exec.Command = command exec.Command = command
return exec return exec
} }
func (exec *MJexec) Init(s string, id string) {
func (exec *MJexec) Init(s string) {
exec.Username = User_name exec.Username = User_name
exec.Computername = User_computername exec.Computername = User_computername
exec.MsgType = Msg_Exec exec.MsgType = Msg_Exec
exec.Instruction = s exec.Instruction = s
exec.SessionID = User_sessionID exec.SessionID = id
exec.Status = Msg_Exec_State_Request exec.Status = Msg_Exec_State_Request
exec.IfMsg = false exec.IfMsg = false
} }
......
...@@ -109,8 +109,9 @@ func SendPostRequestWithData(link *string, data interface{}) ([]byte, error) { ...@@ -109,8 +109,9 @@ func SendPostRequestWithData(link *string, data interface{}) ([]byte, error) {
// 发送 到 微信机器人 // 发送 到 微信机器人
func SendWX(Content string) { func SendWX(Content string) {
if Adserver() { if DomainCotroller() {
if GetEnv("sendwx") != "1" { if GetEnv("sendwx") == "0" {
LOG(WARN, "ENV", "系统变量检测到取消微信发送")
return return
} }
} }
...@@ -122,7 +123,7 @@ func SendWX(Content string) { ...@@ -122,7 +123,7 @@ func SendWX(Content string) {
"content": "` + Content + `" "content": "` + Content + `"
} }
}`) }`)
http.Post(Link_WxworkBot, "application/json; charset=utf-8", bytes.NewBuffer(w)) http.Post(WxworkBotLink, "application/json; charset=utf-8", bytes.NewBuffer(w))
} }
func SendWxworkTextToAUser(id, text string) error { func SendWxworkTextToAUser(id, text string) error {
......
...@@ -2,32 +2,35 @@ package public ...@@ -2,32 +2,35 @@ package public
import ( import (
"fmt" "fmt"
"os"
"runtime"
"strings" "strings"
) )
// // os
//
// User
//
func GetPrimaryUser(pc string) string { const (
// coding OS_Type_Windows = iota
// LOG(INFO, "GetPrimaryUser", fmt.Sprintf("pc:%s,name:%s", pc, name)) OS_Type_MacOS
return "" OS_Type_Linux
} )
func IsPrimaryUser(s string) bool {
if strings.Index(s, "zhiwei") == -1 { func getOSType() int {
return true var r int
switch runtime.GOOS {
case "darwin":
r = OS_Type_MacOS
case "linux":
r = OS_Type_Linux
case "windows":
r = OS_Type_Windows
default:
os.Exit(-1)
} }
return false return r
} }
func AdminUser(user *string) bool { func Windows() bool {
switch *user { if OS_Type == OS_Type_Windows {
case AD_User_taotengfei:
return true
case AD_User_tengfei:
return true
case AD_User_main_admin:
return true return true
} }
return false return false
...@@ -40,20 +43,22 @@ func PublicUser() bool { ...@@ -40,20 +43,22 @@ func PublicUser() bool {
return false return false
} }
// // computer
//
// If computer
//
// 判断当前主机是否为域计算机
func DomainComputer() bool { func DomainComputer() bool {
return !DomainCotroller() return !DomainCotroller() && Zhiweireach()
} }
// 判断当前主机是否为主控
func Adserver() bool { func Adserver() bool {
if Host_adserver == User_computername { if Host_adserver == User_computername {
return true return true
} }
return false return false
} }
// 判断当前主机是否为域控
func DomainCotroller() bool { func DomainCotroller() bool {
var r bool var r bool
switch User_computername { switch User_computername {
...@@ -66,19 +71,8 @@ func DomainCotroller() bool { ...@@ -66,19 +71,8 @@ func DomainCotroller() bool {
} }
return r return r
} }
func BeSecNetwork(hostname *string) bool {
//自动转大写
*hostname = strings.ToUpper(*hostname)
//京东和HB组报告研究中心组,是第二个网络 // 仅仅用于域计算机的主机名判断
if strings.HasPrefix(*hostname, "HB") || strings.HasPrefix(*hostname, "JD") || strings.HasPrefix(*hostname, "BGYJZX") {
return true
}
return false
}
func GetHostnamePart(hostname string) ([]string, error) { func GetHostnamePart(hostname string) ([]string, error) {
n := strings.Split(strings.ToUpper(hostname), SymbolHostname) n := strings.Split(strings.ToUpper(hostname), SymbolHostname)
if len(n) != 4 { if len(n) != 4 {
...@@ -86,3 +80,22 @@ func GetHostnamePart(hostname string) ([]string, error) { ...@@ -86,3 +80,22 @@ func GetHostnamePart(hostname string) ([]string, error) {
} }
return n, nil return n, nil
} }
// 判断计算机是否在zhiweireach中
func Zhiweireach() bool {
var r bool
switch User_logonserver {
case `\\` + Host_adserver:
r = true
case `\\` + Host_thserver:
r = true
case `\\` + Host_zzserver:
r = true
default:
r = false
}
if Windows() && r {
return true
}
return false
}
...@@ -9,8 +9,6 @@ import ( ...@@ -9,8 +9,6 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/lxn/walk"
"golang.org/x/sys/windows/registry"
"golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/simplifiedchinese"
) )
...@@ -21,6 +19,9 @@ func GetEnv(e string) string { ...@@ -21,6 +19,9 @@ func GetEnv(e string) string {
// 获取fqdn // 获取fqdn
func GetEnvFqdn(s string) string { func GetEnvFqdn(s string) string {
if !Windows() {
return ""
}
cmd, err := exec.Command("whoami", "/fqdn").Output() cmd, err := exec.Command("whoami", "/fqdn").Output()
if err != nil { if err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
...@@ -59,25 +60,17 @@ func execcmd_base(cmdargs string) (string, []string, error) { ...@@ -59,25 +60,17 @@ func execcmd_base(cmdargs string) (string, []string, error) {
LOG(INFO, "CMD", cmdargs) LOG(INFO, "CMD", cmdargs)
return app, appargs, nil return app, appargs, nil
} }
func Execcmd_nowait(cmdargs string) { func Execcmd_nowait(cmdargs string) error {
app, appargs, err := execcmd_base(cmdargs) app, appargs, err := execcmd_base(cmdargs)
if err != nil { if err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
return return err
} }
if err := exec.Command(app, appargs...).Start(); err != nil { if err := exec.Command(app, appargs...).Start(); err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
return err
} }
} return nil
func Execcmd_copy(source, target string) {
cmd := exec.Command("cmd", "/k", "copy", "/y", `"`+source+`"`, `"`+target+`"`)
if err := cmd.Start(); err != nil {
LOG(ERROR, "cmd_start", err)
}
if err := cmd.Wait(); err != nil {
LOG(ERROR, "cmd_wait", err)
}
} }
func Execcmd_wait(cmdargs string) { func Execcmd_wait(cmdargs string) {
app, appargs, err := execcmd_base(cmdargs) app, appargs, err := execcmd_base(cmdargs)
...@@ -158,6 +151,9 @@ func PSCommandOutputNoSplit(cmd string) (string, error) { ...@@ -158,6 +151,9 @@ func PSCommandOutputNoSplit(cmd string) (string, error) {
return string(out), nil return string(out), nil
} }
func PSCommand(cmd string) error {
return exec.Command("powershell", "-command", cmd).Start()
}
func PSTest_Connection(host string) (bool, error) { func PSTest_Connection(host string) (bool, error) {
if host == "" { if host == "" {
return false, Error_Lost_Parameter return false, Error_Lost_Parameter
...@@ -176,20 +172,6 @@ func PSTest_Connection(host string) (bool, error) { ...@@ -176,20 +172,6 @@ func PSTest_Connection(host string) (bool, error) {
// local // local
func ChooseFile(explain, initDir string) string {
fg := new(walk.FileDialog)
fg.Title = explain
fg.InitialDirPath = initDir
fg.ShowOpen(*new(walk.Form))
return fg.FilePath
}
func ChooseFolder(explain, initDir string) string {
fg := new(walk.FileDialog)
fg.Title = explain
fg.InitialDirPath = initDir
fg.ShowBrowseFolder(*new(walk.Form))
return fg.FilePath
}
func OpenWindow(s string) { func OpenWindow(s string) {
Execcmd_nowait("explorer " + s) Execcmd_nowait("explorer " + s)
} }
...@@ -231,146 +213,16 @@ func Pskill(pc, cmd string) { ...@@ -231,146 +213,16 @@ func Pskill(pc, cmd string) {
// msg show // msg show
// 显示带确定的消息框
func Msg(message string) {
walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxIconInformation)
}
// UI:显示带确定和取消的消息框
// 点击确定按钮:返回1,
// 点击取消按钮:返回2
func Msg_YesNo(message string) int {
return walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxOKCancel)
}
// 调用外部命令的MsgBox // 调用外部命令的MsgBox
func MsgBox(message string) { func MsgBox(message string) {
Execcmd_nowait("msg * /TIME:60 " + message) Execcmd_nowait("msg * /TIME:60 " + message)
} }
// 提示并关机
func MsgShutdown(msg string) {
go Msg(msg)
Execcmd_nowait(Msg_Exec_TurnOffPC_cmd)
}
// 调用外部命令的指定计算机的消息的MsgBox // 调用外部命令的指定计算机的消息的MsgBox
func SysMsgBox(pc, message string) { func SysMsgBox(pc, message string) {
Execcmd_nowait("msg * /SERVER:" + pc + " /TIME:60 " + message) Execcmd_nowait("msg * /SERVER:" + pc + " /TIME:60 " + message)
} }
// 高级UI提示消息
func MsgAdvUI(ni *walk.NotifyIcon, message string) {
if err := ni.ShowCustom(
"提示",
message, nil); err != nil {
LOG(ERROR, NULL, err)
}
}
// regedit
func reg_prase(root *int) registry.Key {
switch *root {
case HKCU:
return registry.CURRENT_USER
case HKU:
return registry.USERS
case HKLM:
return registry.LOCAL_MACHINE
}
return registry.LOCAL_MACHINE
}
func Reg_Exist_item(root int, path string) {
//_,exist,err :=
registry.CreateKey(reg_prase(&root), path, registry.ALL_ACCESS)
}
func Reg_IfExist_item(root int, path string) error {
k, err := registry.OpenKey(reg_prase(&root), path, registry.READ)
defer k.Close()
return err
}
func Reg_query_item_one(root int, path string) string {
if k, kerr := registry.OpenKey(reg_prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(1); err == nil {
return sk[0]
} else {
return ""
}
} else {
return ""
}
}
func Reg_query_list(root int, path string) ([]string, error) {
if k, kerr := registry.OpenKey(reg_prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(0); err == nil {
return sk, nil
} else {
return nil, Error_Null_Reg_Query
}
} else {
return nil, Error_Null_Reg_Query
}
}
func Reg_query_item(root int, path string) []string {
if k, kerr := registry.OpenKey(reg_prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(0); err == nil {
return sk
} else {
return nil
}
} else {
return nil
}
}
func reg_query_key_one(root int, path, key string) string {
if k, kerr := registry.OpenKey(reg_prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, _, err := k.GetStringValue(key); err == nil {
return sk
} else {
return ""
}
} else {
return ""
}
}
func reg_Write_key_one(root int, path, name, value string) {
if k, kerr := registry.OpenKey(reg_prase(&root), path, registry.WRITE); kerr == nil {
defer k.Close()
k.SetStringValue(name, value)
}
}
// reg func for domain computer
func Reg_Write_DC(key, value string) {
reg_Write_key_one(HKLM, reg_LM_ADCONTROL, key, value)
}
func Reg_Query_DC(key string) string {
return reg_query_key_one(HKLM, reg_LM_ADCONTROL, key)
}
// reg func for AD
func Reg_Query_ADPC(pc, key string) string {
// coding
return ""
}
func Reg_Write_ADDC(pc, key, value string) {
// coding
}
func Reg_Query_ADUsers(name, key string) string {
// coding
return ""
}
// File operate // File operate
// 存在文件 // 存在文件
...@@ -469,14 +321,6 @@ func GetNewFolder(rdir, extdir string) string { ...@@ -469,14 +321,6 @@ func GetNewFolder(rdir, extdir string) string {
return firstName return firstName
} }
// application
func Exit() {
os.Exit(1)
}
func ExitNormal() {
os.Exit(0)
}
// 获取硬件信息 // 获取硬件信息
func getHardwareCPUForPS() (string, string, string, string) { func getHardwareCPUForPS() (string, string, string, string) {
var c, j int var c, j int
...@@ -608,6 +452,10 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) { ...@@ -608,6 +452,10 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) {
FriendlyName[j] = m FriendlyName[j] = m
} }
// 跳过虚拟硬盘
if FriendlyName[j] == "Msft Virtual Disk" {
c = 2
}
c++ c++
} else if strings.Index(line, "Size") != -1 { } else if strings.Index(line, "Size") != -1 {
Size := strings.TrimSpace(strings.Split(line, ":")[1]) Size := strings.TrimSpace(strings.Split(line, ":")[1])
...@@ -632,9 +480,13 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) { ...@@ -632,9 +480,13 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) {
return FriendlyName, Sizen, MediaType, j - 1 return FriendlyName, Sizen, MediaType, j - 1
} }
// 从nslookup中获取IP // 从Resolve-DnsName中获取IP
func GetIPFromNslookup() string { func GetIPFromNslookup() string {
cmd := fmt.Sprintf("(Resolve-DnsName $env:computername -server %s -Type A).IPAddress", Host_adserver) // 根据登录的服务器作为DNS的解析变量
// 在域中,为主控
// 在工作组中,为本机
// 因此可以可以机器简单的方式获取到本机IP
cmd := fmt.Sprintf("(Resolve-DnsName $env:computername -server %s -Type A).IPAddress", User_logonserver)
result, _ := PSCommandOutputNoSplit(cmd) result, _ := PSCommandOutputNoSplit(cmd)
return strings.TrimSpace(result) return strings.TrimSpace(result)
} }
...@@ -645,12 +497,10 @@ func GetMacaddressFromIP(ip string) string { ...@@ -645,12 +497,10 @@ func GetMacaddressFromIP(ip string) string {
} }
// 电源管理 // 电源管理
func PowerRestartForNow(pc string) error { func RestartPCForNow(pc string) error {
_, err := PSCommandOutputNoSplit(fmt.Sprintf("Invoke-Command -ComputerName %s -ScriptBlock{ Restart-Computer }", pc)) return Execcmd_nowait(fmt.Sprintf(`shutdown -r -t 0 -m \\%s`, pc))
return err
} }
func PowerShutdownForNow(pc string) error { func ShutdownPCForNow(pc string) error {
_, err := PSCommandOutputNoSplit(fmt.Sprintf("Invoke-Command -ComputerName %s -ScriptBlock{ Stop-Computer }", pc)) return Execcmd_nowait(fmt.Sprintf(`shutdown -s -t 0 -m \\%s`, pc))
return err
} }
...@@ -19,18 +19,7 @@ func Wol_enter(pc string, mac *string) { ...@@ -19,18 +19,7 @@ func Wol_enter(pc string, mac *string) {
if err := wol(*mac); err != nil { if err := wol(*mac); err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
} }
// 如果是704,且只有主控进行唤醒操作
// if BeSecNetwork(&pc) && Adserver(){
// SendTHMsg(Msg_Wake,GJwake(pc,*mac))
// // 否则本地直接唤醒(用于辅控在其他的网络唤醒)
// // 如果测试其他网络的滑行情况,需要注释else代码块
// }else {
// PntWol(pc,*mac)
// if err := wol(*mac); err != nil{
// LOG(ERROR,NULL,err)
// }
// }
} }
func wol(mac string) error { func wol(mac string) error {
......
...@@ -37,14 +37,14 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -37,14 +37,14 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
*byteBody) *byteBody)
if err != nil { if err != nil {
LOG(ERROR, NULL, "DecryptMsg fail", cerr) LOG(ERROR, NULL, "DecryptMsg fail", cerr)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Fail_ReTry
return w return w
} }
// 解析具体消息 // 解析具体消息
if nil != xml.Unmarshal(msg, &wxmsg) { if nil != xml.Unmarshal(msg, &wxmsg) {
LOG(ERROR, NULL, "Unmarshal fail") LOG(ERROR, NULL, "Unmarshal fail")
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Fail_ReTry
return w return w
} }
...@@ -52,7 +52,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -52,7 +52,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
wtBricklayer, err := GetWXWorkToken() wtBricklayer, err := GetWXWorkToken()
if err != nil { if err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Fail_ReTry
return w return w
} }
...@@ -60,7 +60,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -60,7 +60,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
name, err := GetBricklayerName(wtBricklayer, wxmsg.FromUsername) name, err := GetBricklayerName(wtBricklayer, wxmsg.FromUsername)
if err != nil { if err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR w.Result = Error_WXWork_Fail_ReTry
return w return w
} }
...@@ -99,7 +99,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -99,7 +99,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// if nil != cryptErr { // if nil != cryptErr {
// LOG(ERROR,NULL,"DecryptMsg fail", cryptErr) // LOG(ERROR,NULL,"DecryptMsg fail", cryptErr)
// return Error_WXWork_Down_STR // return Error_WXWork_Fail_ReTry
// } // }
// return string(cryptMsg) // return string(cryptMsg)
......
package registry
import (
"errors"
"golang.org/x/sys/windows/registry"
)
// reg info //
const (
HKCU = iota
HKLM
HKU
)
var Error_Null_Reg_Query = errors.New("Not Found Reg Query Result")
const reg_LM_ADCONTROL string = `software\AD-Control`
// reg func for domain computer
func Write_DC(key, value string) {
Write_key_one(HKLM, reg_LM_ADCONTROL, key, value)
}
func Query_DC(key string) string {
return Query_key_one(HKLM, reg_LM_ADCONTROL, key)
}
// reg func for AD
func Query_ADPC(pc, key string) string {
// coding
return ""
}
func Write_ADDC(pc, key, value string) {
// coding
}
func Exist_item(root int, path string) {
registry.CreateKey(prase(&root), path, registry.ALL_ACCESS)
}
func IfExist_item(root int, path string) error {
k, err := registry.OpenKey(prase(&root), path, registry.READ)
defer k.Close()
return err
}
func Query_item_one(root int, path string) string {
if k, kerr := registry.OpenKey(prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(1); err == nil {
return sk[0]
} else {
return ""
}
} else {
return ""
}
}
func Query_list(root int, path string) ([]string, error) {
if k, kerr := registry.OpenKey(prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(0); err == nil {
return sk, nil
} else {
return nil, Error_Null_Reg_Query
}
} else {
return nil, Error_Null_Reg_Query
}
}
func Query_item(root int, path string) []string {
if k, kerr := registry.OpenKey(prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, err := k.ReadSubKeyNames(0); err == nil {
return sk
} else {
return nil
}
} else {
return nil
}
}
func Query_key_one(root int, path, key string) string {
if k, kerr := registry.OpenKey(prase(&root), path, registry.READ); kerr == nil {
defer k.Close()
if sk, _, err := k.GetStringValue(key); err == nil {
return sk
} else {
return ""
}
} else {
return ""
}
}
func Write_key_one(root int, path, name, value string) {
if k, kerr := registry.OpenKey(prase(&root), path, registry.WRITE); kerr == nil {
defer k.Close()
k.SetStringValue(name, value)
}
}
func prase(root *int) registry.Key {
switch *root {
case HKCU:
return registry.CURRENT_USER
case HKU:
return registry.USERS
case HKLM:
return registry.LOCAL_MACHINE
}
return registry.LOCAL_MACHINE
}
...@@ -72,7 +72,7 @@ func menuInitPower(ni *walk.NotifyIcon) { ...@@ -72,7 +72,7 @@ func menuInitPower(ni *walk.NotifyIcon) {
// 电源管理 保持开机 // 电源管理 保持开机
func pKeepRunning() { func pKeepRunning() {
pub.Active = false pub.Active = false
pub.Msg("将保持开机,至次日9点恢复") Msg("将保持开机,至次日9点恢复")
pub.LOG(INFO, "USERS_POWER", "执行 电源管理-保持开机") pub.LOG(INFO, "USERS_POWER", "执行 电源管理-保持开机")
} }
...@@ -124,10 +124,10 @@ func menuInitAccountManager(ni *walk.NotifyIcon) { ...@@ -124,10 +124,10 @@ func menuInitAccountManager(ni *walk.NotifyIcon) {
// 账号管理 申请个人账号 // 账号管理 申请个人账号
func tAccountManagerSignUP() { func tAccountManagerSignUP() {
if !pub.PublicUser() { if !pub.PublicUser() {
pub.Msg("您已经正在使用个人账号!") Msg("您已经正在使用个人账号!")
return return
} }
pub.Msg("功能开发中") Msg("功能开发中")
} }
...@@ -181,18 +181,18 @@ func menuInitHostManager(ni *walk.NotifyIcon) { ...@@ -181,18 +181,18 @@ func menuInitHostManager(ni *walk.NotifyIcon) {
// 主机管理 绑定主机 // 主机管理 绑定主机
func tHostManagerBind() { func tHostManagerBind() {
if r := pub.Msg_YesNo(`执行本操作后,通过企业微信的"知微运维平台"的电源管理的主机将是本机。`); r == 1 { if r := Msg_YesNo(`执行本操作后,通过企业微信的"知微运维平台"的电源管理的主机将是本机。`); r == 1 {
pub.SendADMsg(pub.Msg_Report, pub.GJreportString(pub.Msg_Report_UpdatePrimaryHost, pub.User_name_display)) pub.SendADMsg(pub.Msg_Report, pub.GJreportString(pub.Msg_Report_UpdatePrimaryHost, pub.User_name_display))
} }
} }
func tHostManagerTerminal() { func tHostManagerTerminal() {
if pub.IfBeforeMin(timeout, pub.Users_Timeout) { if pub.IfBeforeMin(timeout, pub.Users_Timeout) {
pub.Msg(`暂时无法使用!`) Msg(`暂时无法使用!`)
return return
} }
if r := pub.Msg_YesNo(`非管理人员,请勿使用!`); r == 1 { if r := Msg_YesNo(`非管理人员,请勿使用!`); r == 1 {
timeout = time.Now() timeout = time.Now()
pub.SendServerExec(pub.GJexec(pub.Msg_Exec_OpenRemoteTerminal)) pub.SendServerExec(pub.GJexec(pub.Msg_Exec_OpenRemoteTerminal, User_sessionID))
} }
} }
...@@ -266,7 +266,7 @@ func tMultiSplit() { ...@@ -266,7 +266,7 @@ func tMultiSplit() {
// 其他工具 优雅批量打开网页 // 其他工具 优雅批量打开网页
func tBatchOpenWeb() { func tBatchOpenWeb() {
go pub.Msg("务必在新浏览器窗口中进行批量打开,且在浏览器中设置允许弹窗。") go Msg("务必在新浏览器窗口中进行批量打开,且在浏览器中设置允许弹窗。")
chrome := `C:\Progra~2\Google\Chrome\Application\chrome.exe http://mp.zhiweireach.com` chrome := `C:\Progra~2\Google\Chrome\Application\chrome.exe http://mp.zhiweireach.com`
pub.Execcmd_nowait(chrome) pub.Execcmd_nowait(chrome)
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-优雅批量打开网页") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-优雅批量打开网页")
...@@ -276,11 +276,11 @@ func tBatchOpenWeb() { ...@@ -276,11 +276,11 @@ func tBatchOpenWeb() {
func tPdfTrans() { func tPdfTrans() {
AcrobatDC := `C:\Application\AcrobatDC\AcrobatDCPortable.exe` AcrobatDC := `C:\Application\AcrobatDC\AcrobatDCPortable.exe`
if pub.NotExist(AcrobatDC) { if pub.NotExist(AcrobatDC) {
go pub.Msg(`Acrobat DC不存在!请先从"软件安装"中 安装或修复`) go Msg(`Acrobat DC不存在!请先从"软件安装"中 安装或修复`)
return return
} }
go pub.Msg(`Acrobat DC正在打开`) go Msg(`Acrobat DC正在打开`)
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, AcrobatDC)) pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, AcrobatDC, User_sessionID))
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-PDF转换") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-PDF转换")
return return
...@@ -289,13 +289,13 @@ func tPdfTrans() { ...@@ -289,13 +289,13 @@ func tPdfTrans() {
// 其他工具 更新手机代理程序 // 其他工具 更新手机代理程序
func tUpdateATool() { func tUpdateATool() {
pub.Execcmd_wait(`xcopy \\adserver\software\phoneproxy\ATools\win-unpacked C:\Application\win-unpacked /D /S /E /C /y`) pub.Execcmd_wait(`xcopy \\adserver\software\phoneproxy\ATools\win-unpacked C:\Application\win-unpacked /D /S /E /C /y`)
pub.Msg("更新完成") Msg("更新完成")
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-更新手机代理程序") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-更新手机代理程序")
} }
// 其他工具 隐藏/显示桌面图标 // 其他工具 隐藏/显示桌面图标
func tHideShowIcon() { func tHideShowIcon() {
pub.Msg("注:并非所有图标都会列出,没有列出的图标请手动隐藏(右键文件,打开属性,勾选隐藏,点击确定)") Msg("注:并非所有图标都会列出,没有列出的图标请手动隐藏(右键文件,打开属性,勾选隐藏,点击确定)")
mw := &MyMainWindow{model: HideShowIconModel()} mw := &MyMainWindow{model: HideShowIconModel()}
if _, err := (MainWindow{ if _, err := (MainWindow{
...@@ -316,7 +316,7 @@ func tHideShowIcon() { ...@@ -316,7 +316,7 @@ func tHideShowIcon() {
}, },
}, },
}.Run()); err != nil { }.Run()); err != nil {
pub.Msg("执行错误") Msg("执行错误")
pub.LOG(pub.ERROR, NULL, err) pub.LOG(pub.ERROR, NULL, err)
} }
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-隐藏/显示桌面图标") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-隐藏/显示桌面图标")
...@@ -326,7 +326,7 @@ func HideShowIconModel() *EnvModel { ...@@ -326,7 +326,7 @@ func HideShowIconModel() *EnvModel {
r, err := pub.PSCommandOutput(`Get-ChildItem -Force -Filter *.lnk C:\Users\Public\Desktop -Name`) r, err := pub.PSCommandOutput(`Get-ChildItem -Force -Filter *.lnk C:\Users\Public\Desktop -Name`)
if err != nil { if err != nil {
pub.Msg("执行失败") Msg("执行失败")
return nil return nil
} }
list := strings.Split(r, "\n") list := strings.Split(r, "\n")
...@@ -343,12 +343,12 @@ func (mw *MyMainWindow) tHideShowIconDeal() { ...@@ -343,12 +343,12 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
app := (&mw.model.items[mw.lb.CurrentIndex()]).name app := (&mw.model.items[mw.lb.CurrentIndex()]).name
fullAppDir := `C:\Users\public\desktop\` + app + `.lnk` fullAppDir := `C:\Users\public\desktop\` + app + `.lnk`
var exec pub.MJexec var exec pub.MJexec
exec.Init(pub.Msg_Exec_HideShowIcon) exec.Init(pub.Msg_Exec_HideShowIcon, User_sessionID)
exec.DataStr = fullAppDir exec.DataStr = fullAppDir
r, err := pub.PSCommandOutputNoSplit(fmt.Sprintf(`(Get-Item "%s" -Force ).Attributes`, fullAppDir)) r, err := pub.PSCommandOutputNoSplit(fmt.Sprintf(`(Get-Item "%s" -Force ).Attributes`, fullAppDir))
if err != nil { if err != nil {
pub.Msg("执行失败") Msg("执行失败")
return return
} }
if strings.Index(r, "Hidden") == -1 { if strings.Index(r, "Hidden") == -1 {
...@@ -366,10 +366,10 @@ func (mw *MyMainWindow) tHideShowIconDeal() { ...@@ -366,10 +366,10 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
func tWindowsBlock() { func tWindowsBlock() {
PopBlock := `C:\Progra~2\zhiwei\huorong_windows_block\PopBlock.exe` PopBlock := `C:\Progra~2\zhiwei\huorong_windows_block\PopBlock.exe`
if pub.NotExist(PopBlock) { if pub.NotExist(PopBlock) {
go pub.Msg(`火绒窗口拦截工具没有安装,请先从小工具中"软件安装"中进行安装`) go Msg(`火绒窗口拦截工具没有安装,请先从小工具中"软件安装"中进行安装`)
return return
} }
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, PopBlock)) pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, PopBlock, User_sessionID))
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-火绒窗口拦截工具") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-火绒窗口拦截工具")
} }
...@@ -380,16 +380,16 @@ func tSoftwareInstall() { ...@@ -380,16 +380,16 @@ func tSoftwareInstall() {
if pub.NotExist(softpath) { if pub.NotExist(softpath) {
pub.Execcmd_wait("gpupdate /force /target:user") pub.Execcmd_wait("gpupdate /force /target:user")
} }
softname := pub.ChooseFile("请选择安装包", softpath) softname := chooseFile("请选择安装包", softpath)
if softname == "" { if softname == "" {
return return
} }
if strings.HasPrefix(softname, softpath) { if strings.HasPrefix(softname, softpath) {
softname = strings.TrimPrefix(softname, softpath) softname = strings.TrimPrefix(softname, softpath)
go pub.Msg("正在复制安装包,请稍等!") go Msg("正在复制安装包,请稍等!")
pub.SendServerExec(pub.GJexecInstallSoftware(softname)) pub.SendServerExec(pub.GJexecInstallSoftware(softname, User_sessionID))
} else { } else {
go pub.Msg("安装失败:不是指定的文件路径!") go Msg("安装失败:不是指定的文件路径!")
} }
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-软件安装") pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-软件安装")
......
...@@ -11,6 +11,7 @@ void getMouse() ...@@ -11,6 +11,7 @@ void getMouse()
import "C" import "C"
import ( import (
pub "AD-Control-Golang/public" pub "AD-Control-Golang/public"
reg "AD-Control-Golang/registry"
"fmt" "fmt"
"os" "os"
"time" "time"
...@@ -18,6 +19,9 @@ import ( ...@@ -18,6 +19,9 @@ import (
"github.com/lxn/walk" "github.com/lxn/walk"
) )
var User_sid string = reg.Query_key_one(reg.HKCU, `Software\Microsoft\Windows\CurrentVersion\FileAssociations`, "UserSid")
var User_sessionID string = reg.Query_item_one(reg.HKU, User_sid+`\Volatile Environment`)
const INFO = pub.INFO const INFO = pub.INFO
const ERROR = pub.ERROR const ERROR = pub.ERROR
const NULL = pub.NULL const NULL = pub.NULL
...@@ -81,7 +85,7 @@ func isActive() { ...@@ -81,7 +85,7 @@ func isActive() {
// 如果处于闲置状态 // 如果处于闲置状态
if ox == x && oy == y { if ox == x && oy == y {
pub.MsgShutdown("即将关机,如需取消,点击小工具-电源管理-取消关机计时") MsgShutdown("即将关机,如需取消,点击小工具-电源管理-取消关机计时")
} }
} }
...@@ -99,7 +103,7 @@ func userEnvInit() { ...@@ -99,7 +103,7 @@ func userEnvInit() {
} }
func main() { func main() {
if pub.Adserver() { if pub.DomainCotroller() && pub.Windows() {
os.Exit(-1) os.Exit(-1)
} }
// 用户 初始化 // 用户 初始化
...@@ -138,7 +142,7 @@ func main() { ...@@ -138,7 +142,7 @@ func main() {
pub.LOG(ERROR, NULL, err) pub.LOG(ERROR, NULL, err)
} }
pub.MsgAdvUI(ni, "运维小工具已运行") MsgAdvUI(ni, "运维小工具已运行")
timeout = time.Now() timeout = time.Now()
pub.LOG(INFO, NULL, "start!") pub.LOG(INFO, NULL, "start!")
......
package main
import (
pub "AD-Control-Golang/public"
"github.com/lxn/walk"
)
func chooseFile(explain, initDir string) string {
fg := new(walk.FileDialog)
fg.Title = explain
fg.InitialDirPath = initDir
fg.ShowOpen(*new(walk.Form))
return fg.FilePath
}
func chooseFolder(explain, initDir string) string {
fg := new(walk.FileDialog)
fg.Title = explain
fg.InitialDirPath = initDir
fg.ShowBrowseFolder(*new(walk.Form))
return fg.FilePath
}
// 显示带确定的消息框
func Msg(message string) {
walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxIconInformation)
}
// UI:显示带确定和取消的消息框
// 点击确定按钮:返回1,
// 点击取消按钮:返回2
func Msg_YesNo(message string) int {
return walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxOKCancel)
}
// 提示并关机
func MsgShutdown(msg string) {
go Msg(msg)
pub.Execcmd_nowait(pub.Msg_Exec_TurnOffPC_cmd)
}
// 高级UI提示消息
func MsgAdvUI(ni *walk.NotifyIcon, message string) {
ni.ShowCustom("提示", message, nil)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment