Commit d6cacfef by 陶腾飞

2022-04-04

parent b9e5176d
......@@ -2,8 +2,6 @@ test/
testwalk/
testmain/
exe/
pkg/
catHardware/
.vscode/
*.bat
*.ps1
......
......@@ -43,7 +43,6 @@
> 3. 主机唤醒
> 4. 同步cmdb
> 5. 硬件信息收集
> 6. 获取token
## 三、[cmdb](http://cmdb.zhiweidata.top/instances/types/28)
......@@ -83,6 +82,7 @@
- 2022/03/29 v2.0.0 删除备份策略,同步域计算机信息到cmdb,添加账户、主机管理管理,唤醒策略更新,日志统一收集处理,运维平台添加管理员指令
- 2022/03/30 v2.1.0 支持通过cmdb获取字段来唤醒主机,日志输出优化,支持通过运维平台打开远程终端
- 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
import (
pub "AD-Control-Golang/public"
"encoding/json"
"flag"
"fmt"
......@@ -24,7 +25,6 @@ func main() {
var wolHostText = flag.String("wolhost", "", "input hostname for waking pc")
var wolAllText = flag.Bool("wolall", false, "wake all Domain Computer")
var hourText = flag.Bool("hour", false, "exec task at the time")
var cmdbtokenText = flag.Bool("cmdbtoken", false, "")
var loglevel = flag.String("loglevel", INFO, "")
var force = flag.Bool("force", false, "force exec,ignore other")
var quick = flag.Bool("quick", false, "quickly exec")
......@@ -57,9 +57,6 @@ func main() {
pub.DomainCotroller()
wolALL()
} else if *cmdbtokenText {
pub.DomainCotroller()
pub.CmdbTokenUpdate()
}
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
import (
pub "AD-Control-Golang/public"
reg "AD-Control-Golang/registry"
"net"
"net/http"
"os"
......@@ -9,9 +10,33 @@ import (
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() {
l, _ = os.OpenFile(`H:\logs\users.log`, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
//pub.Loglevel = pub.DEBUG
mainInit()
go messionloop()
go listenLog()
listenMsg()
......@@ -19,7 +44,6 @@ func main() {
func listenMsg() {
pub.LOG(pub.INFO, pub.NULL, "start MSG daemon!")
http.HandleFunc("/", pub.DealMsgEnter)
http.ListenAndServe(pub.DaemonListen, nil)
}
......
......@@ -8,10 +8,10 @@ import (
"io/ioutil"
"net/http"
"net/url"
"strings"
)
var client = http.Client{}
var Reg_cmdb_token string
func getVFromK(cir *CIRecordResult, k string) string {
var r string
......@@ -66,7 +66,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(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)
var cir CIRecordReq
data, err := cmdbGET(url)
......@@ -89,7 +89,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
}
cir.Uni_one = fmt.Sprintf("%v", NowTimestampNano())
cmdbPath = "api/v0.1/ci"
url = fmt.Sprintf("%s/%s", cmdbUrl, cmdbPath)
url = fmt.Sprintf("%s/%s", CmdbUrl, cmdbPath)
jsondata, jsonerr := cir.String()
LOG(DEBUG, "CMDB_NEW", fmt.Sprintf("路径:%s\n参数:%s", url, string(jsondata)))
......@@ -98,7 +98,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
return 0, false
}
if _, err := cmdbPOST(url, jsondata); err != nil {
if _, err := CmdbPOST(url, jsondata); err != nil {
LOG(ERROR, CMDB, err)
return 0, false
} else {
......@@ -120,7 +120,7 @@ func cmdbExistRecord(k, v string) (int, bool) {
func cmdbUpdateRecordFromJSON(datastr string, ci int) error {
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)
data, err := cmdbPUT(url, []byte(datastr))
......@@ -139,34 +139,6 @@ func cmdbUpdateRecordFromJSON(datastr string, ci int) error {
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
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="
v = cmdbChineseURL(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)
var cir CIRecordReq
data, err := cmdbGET(url)
......@@ -204,7 +176,7 @@ func CmdbRecordValueClear(k, v string) error {
var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(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)
var cir CIRecordReq
......@@ -241,7 +213,7 @@ func CmdbGetWordFromKV(k, v, w string) (string, error) {
var cmdbPath string = "api/v0.1/ci/s?q="
v = cmdbChineseURL(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)
var cir CIRecordReq
data, err := cmdbGET(url)
......@@ -274,7 +246,7 @@ func CmdbGetWordFromKV2(k, v, a, b string) (string, string, error) {
v = cmdbChineseURL(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)
var cir CIRecordReq
data, err := cmdbGET(url)
......@@ -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.Write(reqdata)
h, err := http.NewRequest("POST", url, buf)
......@@ -310,9 +282,10 @@ func cmdbPOST(url string, reqdata []byte) ([]byte, error) {
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 {
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken))
}
// if strings.Index(url, "api/login") == -1 {
// h.Header.Add("Access-Token", CmdbPass)
// }
h.Header.Add("Access-Token", Reg_cmdb_token)
res, err := (&client).Do(h)
if err != nil {
......@@ -342,9 +315,7 @@ func cmdbPUT(url string, reqdata []byte) ([]byte, error) {
// 如果需要token,则从注册表获取,token的获取是来自任务计划自动更新
// 如果,仅仅访问api/login,则不需要去获取token
if strings.Index(url, "api/login") == -1 {
h.Header.Add("Access-Token", Reg_Query_DC(Reg_Key_cmdbtoken))
}
h.Header.Add("Access-Token", Reg_cmdb_token)
res, err := (&client).Do(h)
if err != nil {
......
......@@ -58,20 +58,6 @@ type CIRecordStartup struct {
Disk string `json:"disk"` // 硬盘
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 {
Ci_id int `json:"ci_id"`
}
......@@ -98,7 +84,7 @@ func (cir *CIRecordResult) BasicInfo(v string) error {
return fmt.Errorf("主机命令错误")
}
cir.Seat = hostnameSplit[2]
cir.Ci_type = cmdbCITypeComputer
cir.Ci_type = CmdbCITypeComputer
return err
}
func (cir *CIRecordStartup) GetHardWare() {
......@@ -198,7 +184,7 @@ func (cir *CIRecordStartup) GetDept() (string, error) {
result = "金融组"
case "TXHD":
result = "腾讯互动组"
case "TXMT":
case "TXWJ":
result = "腾讯危机组"
case "JS":
result = "技术组"
......
package public
// os //
var OS_Type = getOSType()
// other //
var Active bool = true
......@@ -8,28 +11,20 @@ const SymbolHostname = "-"
// AD-Control //
const Version string = "2.2.0"
const Version string = "2.2.1"
const Host_adserver string = "ADSERVER"
const Host_adserver_ip string = "192.168.0.20"
const Host_thserver string = "THSERVER"
const Host_zzserver string = "ZZSERVER"
const DaemonListen string = ":16823"
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"
const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei"
const AD_User_ADControl string = "ad-control@zhiweireach.com"
const AD_User_ADControl_key string = "golang&*90-="
var ADServerDaemon string = Host_adserver + DaemonListen
var ADServerLogDaemon string = Host_adserver + DaemonLogListen
var THServerDaemon string = Host_thserver + DaemonListen
// users //
const Users_Timeout int = 3
// user //
......@@ -37,11 +32,11 @@ const Users_Timeout int = 3
var User_computername string = GetEnv("COMPUTERNAME")
var User_homeshare string = GetEnv("HOMESHARE")
var User_userdomain string = GetEnv("USERDOMAIN")
var User_userprofile string = GetEnv("USERPROFILE")
var User_name string = GetEnv("USERNAME")
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_logonserver string = GetEnv("LOGONSERVER")
// SMB Folder//
......@@ -71,32 +66,31 @@ const (
HKU
)
// reg value //
const reg_LM_ADCONTROL string = `software\AD-Control`
const Reg_Key_cmdbtoken string = "cmdb_token"
const Reg_Value_ON string = "ON"
const Reg_Value_OFF string = "OFF"
// 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_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start "
// wxwork key //
const WxworkTokenMsgSend string = "AvAQlFNxy1UQB3CjRml3GfKf7Y"
const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy"
const WxworkReceiverId string = "ww49cfd580625083c9"
const WxworkCorid string = "ww49cfd580625083c9"
const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I"
const WxWorkAgentID string = "1000014"
var WxworkBotLink string
var WxworkTokenMsgSend string
var WxworkEncodingAseKey string
var WxworkReceiverId string
var WxworkCorid string
var WxworkCorpSecret string
var WxWorkAgentID string
// log level //
var Loglevel string = INFO
const INFO string = "info"
const WARN string = "warn"
const ERROR string = "error"
const DEBUG string = "debug"
const NULL string = ""
......@@ -105,6 +99,7 @@ const NULL string = ""
const CMDB string = "cmdb"
// cmdb //
const cmdbUrl string = "http://192.168.0.21:5000"
const cmdbCITypeComputer string = "28"
const cmdbPass string = `{"password":"3f7eba3920866b2c2375ba61117c42bf","username":"tengfei"}`
var CmdbUrl string
var CmdbCITypeComputer string
var AD_User_ADControl string
var AD_User_ADControl_key string
......@@ -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_Not_Msg = errors.New("isn't defined msg")
var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR)
var Error_WXWork_Down_STR = "后台更新中..."
var Error_WXWork_Down = errors.New(Error_WXWork_Fail_ReTry)
var Error_WXWork_Fail_ReTry = "后台错误,稍后重试!"
const Error_CMDB_UPDATE_REQ = "更新失败"
......
......@@ -41,11 +41,11 @@ func logDeal(level string, l *logs) {
if err != nil {
SendWxworkTextToAdmins(err.Error())
}
if DomainComputer() {
if DomainComputer() || !Zhiweireach() {
SendLog(string(textbyte))
return
}
if DomainCotroller() {
switch level {
// 绿色
......@@ -64,7 +64,7 @@ func logDeal(level string, l *logs) {
return
}
}
func LOG(level string, msgtype string, args ...interface{}) {
func LOG(level string, msgtype string, args ...any) {
if (Loglevel != DEBUG) && (level == DEBUG) {
return
}
......@@ -72,6 +72,6 @@ func LOG(level string, msgtype string, args ...interface{}) {
l.Host = User_computername
l.Level = level
l.MsgType = msgtype
l.Message = fmt.Sprint(fmt.Sprint(args...))
l.Message = fmt.Sprint(args...)
logDeal(level, &l)
}
......@@ -81,7 +81,7 @@ func (rep *MJreport) MsgDeal() interface{} {
LOG(INFO, rep.Instruction, rep.Computername)
}
}
// 客户端处理
// 客户端
case Msg_status_deal:
return nil
}
......@@ -141,7 +141,7 @@ func (rep *MJreport) MsgDeal() interface{} {
// 客户端
case Msg_status_deal:
if rep.DataStr != "" {
Msg(rep.DataStr)
MsgBox(rep.DataStr)
}
}
default:
......@@ -172,7 +172,7 @@ func (exec *MJexec) MsgDeal() interface{} {
exec.Status = Msg_Exec_State_Over
case Msg_Exec_State_Over:
if exec.IfMsg {
Msg(exec.Explain)
MsgBox(exec.Explain)
}
return nil
}
......@@ -274,7 +274,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, mac, err = CmdbGetWordFromKV2(Cmdb_Username, wxwork.Name, Cmdb_Product_name, Cmdb_Mac)
switch err {
case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`)
wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return
case nil:
break
......@@ -329,7 +329,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err {
case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`)
wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return
case nil:
break
......@@ -352,7 +352,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
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)
wxwork.SendText(Error_WXWork_Fail_ReTry)
return
......@@ -390,7 +390,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err {
case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`)
wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return
case nil:
break
......@@ -413,7 +413,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
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)
wxwork.SendText(Error_WXWork_Fail_ReTry)
return
......@@ -447,7 +447,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
pc, err = CmdbGetWordFromKV(Cmdb_Username, wxwork.Name, Cmdb_Product_name)
switch err {
case Error_CMDB_No_Record:
wxwork.SendText(`您还没有绑定个人主机,请使个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"`)
wxwork.SendText(`您还没有绑定个人主机,请使用个人账号登录系统后,打开小工具,点击"主机管理"-"绑定主机"!`)
return
case nil:
break
......@@ -459,11 +459,11 @@ func (wxwork *MJwxwork) MsgDealSend() {
// 检查 主机连接情况
status, err := PSTest_Connection(pc)
if err != nil {
wxwork.Result = Error_WXWork_Down_STR
wxwork.Result = Error_WXWork_Fail_ReTry
LOG(ERROR, NULL, err)
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 {
wxwork.Result = "主机已启动"
......
......@@ -171,32 +171,31 @@ func (rep *MJreport) init(Report string) {
// Exec
func GJexec(s string) MJexec {
func GJexec(s, id string) MJexec {
var exec MJexec
exec.Init(s)
exec.Init(s, id)
return exec
}
func GJexecInstallSoftware(s string) interface{} {
func GJexecInstallSoftware(s, id string) interface{} {
var exec MJexec
exec.Init(s)
exec.Init(s, id)
exec.Instruction = Msg_Exec_InstallSoftware
exec.Command = s
return exec
}
func GJexecDIYFlag(flag, command string) MJexec {
func GJexecDIYFlag(flag, command, id string) MJexec {
var exec MJexec
exec.Init(flag)
exec.Init(flag, id)
exec.Command = command
return exec
}
func (exec *MJexec) Init(s string) {
func (exec *MJexec) Init(s string, id string) {
exec.Username = User_name
exec.Computername = User_computername
exec.MsgType = Msg_Exec
exec.Instruction = s
exec.SessionID = User_sessionID
exec.SessionID = id
exec.Status = Msg_Exec_State_Request
exec.IfMsg = false
}
......
......@@ -109,8 +109,9 @@ func SendPostRequestWithData(link *string, data interface{}) ([]byte, error) {
// 发送 到 微信机器人
func SendWX(Content string) {
if Adserver() {
if GetEnv("sendwx") != "1" {
if DomainCotroller() {
if GetEnv("sendwx") == "0" {
LOG(WARN, "ENV", "系统变量检测到取消微信发送")
return
}
}
......@@ -122,7 +123,7 @@ func SendWX(Content string) {
"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 {
......
......@@ -2,32 +2,35 @@ package public
import (
"fmt"
"os"
"runtime"
"strings"
)
//
//
// User
//
// os
func GetPrimaryUser(pc string) string {
// coding
// LOG(INFO, "GetPrimaryUser", fmt.Sprintf("pc:%s,name:%s", pc, name))
return ""
}
func IsPrimaryUser(s string) bool {
if strings.Index(s, "zhiwei") == -1 {
return true
const (
OS_Type_Windows = iota
OS_Type_MacOS
OS_Type_Linux
)
func getOSType() int {
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 {
switch *user {
case AD_User_taotengfei:
return true
case AD_User_tengfei:
return true
case AD_User_main_admin:
func Windows() bool {
if OS_Type == OS_Type_Windows {
return true
}
return false
......@@ -40,20 +43,22 @@ func PublicUser() bool {
return false
}
//
//
// If computer
//
// computer
// 判断当前主机是否为域计算机
func DomainComputer() bool {
return !DomainCotroller()
return !DomainCotroller() && Zhiweireach()
}
// 判断当前主机是否为主控
func Adserver() bool {
if Host_adserver == User_computername {
return true
}
return false
}
// 判断当前主机是否为域控
func DomainCotroller() bool {
var r bool
switch User_computername {
......@@ -66,19 +71,8 @@ func DomainCotroller() bool {
}
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) {
n := strings.Split(strings.ToUpper(hostname), SymbolHostname)
if len(n) != 4 {
......@@ -86,3 +80,22 @@ func GetHostnamePart(hostname string) ([]string, error) {
}
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 (
"strconv"
"strings"
"github.com/lxn/walk"
"golang.org/x/sys/windows/registry"
"golang.org/x/text/encoding/simplifiedchinese"
)
......@@ -21,6 +19,9 @@ func GetEnv(e string) string {
// 获取fqdn
func GetEnvFqdn(s string) string {
if !Windows() {
return ""
}
cmd, err := exec.Command("whoami", "/fqdn").Output()
if err != nil {
LOG(ERROR, NULL, err)
......@@ -59,25 +60,17 @@ func execcmd_base(cmdargs string) (string, []string, error) {
LOG(INFO, "CMD", cmdargs)
return app, appargs, nil
}
func Execcmd_nowait(cmdargs string) {
func Execcmd_nowait(cmdargs string) error {
app, appargs, err := execcmd_base(cmdargs)
if err != nil {
LOG(ERROR, NULL, err)
return
return err
}
if err := exec.Command(app, appargs...).Start(); err != nil {
LOG(ERROR, NULL, err)
return err
}
}
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)
}
return nil
}
func Execcmd_wait(cmdargs string) {
app, appargs, err := execcmd_base(cmdargs)
......@@ -158,6 +151,9 @@ func PSCommandOutputNoSplit(cmd string) (string, error) {
return string(out), nil
}
func PSCommand(cmd string) error {
return exec.Command("powershell", "-command", cmd).Start()
}
func PSTest_Connection(host string) (bool, error) {
if host == "" {
return false, Error_Lost_Parameter
......@@ -176,20 +172,6 @@ func PSTest_Connection(host string) (bool, error) {
// 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) {
Execcmd_nowait("explorer " + s)
}
......@@ -231,146 +213,16 @@ func Pskill(pc, cmd string) {
// 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
func MsgBox(message string) {
Execcmd_nowait("msg * /TIME:60 " + message)
}
// 提示并关机
func MsgShutdown(msg string) {
go Msg(msg)
Execcmd_nowait(Msg_Exec_TurnOffPC_cmd)
}
// 调用外部命令的指定计算机的消息的MsgBox
func SysMsgBox(pc, message string) {
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
// 存在文件
......@@ -469,14 +321,6 @@ func GetNewFolder(rdir, extdir string) string {
return firstName
}
// application
func Exit() {
os.Exit(1)
}
func ExitNormal() {
os.Exit(0)
}
// 获取硬件信息
func getHardwareCPUForPS() (string, string, string, string) {
var c, j int
......@@ -608,6 +452,10 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) {
FriendlyName[j] = m
}
// 跳过虚拟硬盘
if FriendlyName[j] == "Msft Virtual Disk" {
c = 2
}
c++
} else if strings.Index(line, "Size") != -1 {
Size := strings.TrimSpace(strings.Split(line, ":")[1])
......@@ -632,9 +480,13 @@ func getHardwareHardDiskForPS(mini bool) ([]string, []int64, []string, int) {
return FriendlyName, Sizen, MediaType, j - 1
}
// 从nslookup中获取IP
// 从Resolve-DnsName中获取IP
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)
return strings.TrimSpace(result)
}
......@@ -645,12 +497,10 @@ func GetMacaddressFromIP(ip string) string {
}
// 电源管理
func PowerRestartForNow(pc string) error {
_, err := PSCommandOutputNoSplit(fmt.Sprintf("Invoke-Command -ComputerName %s -ScriptBlock{ Restart-Computer }", pc))
return err
func RestartPCForNow(pc string) error {
return Execcmd_nowait(fmt.Sprintf(`shutdown -r -t 0 -m \\%s`, pc))
}
func PowerShutdownForNow(pc string) error {
_, err := PSCommandOutputNoSplit(fmt.Sprintf("Invoke-Command -ComputerName %s -ScriptBlock{ Stop-Computer }", pc))
return err
func ShutdownPCForNow(pc string) error {
return Execcmd_nowait(fmt.Sprintf(`shutdown -s -t 0 -m \\%s`, pc))
}
......@@ -19,18 +19,7 @@ func Wol_enter(pc string, mac *string) {
if err := wol(*mac); err != nil {
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 {
......
......@@ -37,14 +37,14 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
*byteBody)
if err != nil {
LOG(ERROR, NULL, "DecryptMsg fail", cerr)
w.Result = Error_WXWork_Down_STR
w.Result = Error_WXWork_Fail_ReTry
return w
}
// 解析具体消息
if nil != xml.Unmarshal(msg, &wxmsg) {
LOG(ERROR, NULL, "Unmarshal fail")
w.Result = Error_WXWork_Down_STR
w.Result = Error_WXWork_Fail_ReTry
return w
}
......@@ -52,7 +52,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
wtBricklayer, err := GetWXWorkToken()
if err != nil {
LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR
w.Result = Error_WXWork_Fail_ReTry
return w
}
......@@ -60,7 +60,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
name, err := GetBricklayerName(wtBricklayer, wxmsg.FromUsername)
if err != nil {
LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Down_STR
w.Result = Error_WXWork_Fail_ReTry
return w
}
......@@ -99,7 +99,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// if nil != cryptErr {
// LOG(ERROR,NULL,"DecryptMsg fail", cryptErr)
// return Error_WXWork_Down_STR
// return Error_WXWork_Fail_ReTry
// }
// 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) {
// 电源管理 保持开机
func pKeepRunning() {
pub.Active = false
pub.Msg("将保持开机,至次日9点恢复")
Msg("将保持开机,至次日9点恢复")
pub.LOG(INFO, "USERS_POWER", "执行 电源管理-保持开机")
}
......@@ -124,10 +124,10 @@ func menuInitAccountManager(ni *walk.NotifyIcon) {
// 账号管理 申请个人账号
func tAccountManagerSignUP() {
if !pub.PublicUser() {
pub.Msg("您已经正在使用个人账号!")
Msg("您已经正在使用个人账号!")
return
}
pub.Msg("功能开发中")
Msg("功能开发中")
}
......@@ -181,18 +181,18 @@ func menuInitHostManager(ni *walk.NotifyIcon) {
// 主机管理 绑定主机
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))
}
}
func tHostManagerTerminal() {
if pub.IfBeforeMin(timeout, pub.Users_Timeout) {
pub.Msg(`暂时无法使用!`)
Msg(`暂时无法使用!`)
return
}
if r := pub.Msg_YesNo(`非管理人员,请勿使用!`); r == 1 {
if r := Msg_YesNo(`非管理人员,请勿使用!`); r == 1 {
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() {
// 其他工具 优雅批量打开网页
func tBatchOpenWeb() {
go pub.Msg("务必在新浏览器窗口中进行批量打开,且在浏览器中设置允许弹窗。")
go Msg("务必在新浏览器窗口中进行批量打开,且在浏览器中设置允许弹窗。")
chrome := `C:\Progra~2\Google\Chrome\Application\chrome.exe http://mp.zhiweireach.com`
pub.Execcmd_nowait(chrome)
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-优雅批量打开网页")
......@@ -276,11 +276,11 @@ func tBatchOpenWeb() {
func tPdfTrans() {
AcrobatDC := `C:\Application\AcrobatDC\AcrobatDCPortable.exe`
if pub.NotExist(AcrobatDC) {
go pub.Msg(`Acrobat DC不存在!请先从"软件安装"中 安装或修复`)
go Msg(`Acrobat DC不存在!请先从"软件安装"中 安装或修复`)
return
}
go pub.Msg(`Acrobat DC正在打开`)
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, AcrobatDC))
go Msg(`Acrobat DC正在打开`)
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE, AcrobatDC, User_sessionID))
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-PDF转换")
return
......@@ -289,13 +289,13 @@ func tPdfTrans() {
// 其他工具 更新手机代理程序
func tUpdateATool() {
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", "执行 其他工具-更新手机代理程序")
}
// 其他工具 隐藏/显示桌面图标
func tHideShowIcon() {
pub.Msg("注:并非所有图标都会列出,没有列出的图标请手动隐藏(右键文件,打开属性,勾选隐藏,点击确定)")
Msg("注:并非所有图标都会列出,没有列出的图标请手动隐藏(右键文件,打开属性,勾选隐藏,点击确定)")
mw := &MyMainWindow{model: HideShowIconModel()}
if _, err := (MainWindow{
......@@ -316,7 +316,7 @@ func tHideShowIcon() {
},
},
}.Run()); err != nil {
pub.Msg("执行错误")
Msg("执行错误")
pub.LOG(pub.ERROR, NULL, err)
}
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-隐藏/显示桌面图标")
......@@ -326,7 +326,7 @@ func HideShowIconModel() *EnvModel {
r, err := pub.PSCommandOutput(`Get-ChildItem -Force -Filter *.lnk C:\Users\Public\Desktop -Name`)
if err != nil {
pub.Msg("执行失败")
Msg("执行失败")
return nil
}
list := strings.Split(r, "\n")
......@@ -343,12 +343,12 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
app := (&mw.model.items[mw.lb.CurrentIndex()]).name
fullAppDir := `C:\Users\public\desktop\` + app + `.lnk`
var exec pub.MJexec
exec.Init(pub.Msg_Exec_HideShowIcon)
exec.Init(pub.Msg_Exec_HideShowIcon, User_sessionID)
exec.DataStr = fullAppDir
r, err := pub.PSCommandOutputNoSplit(fmt.Sprintf(`(Get-Item "%s" -Force ).Attributes`, fullAppDir))
if err != nil {
pub.Msg("执行失败")
Msg("执行失败")
return
}
if strings.Index(r, "Hidden") == -1 {
......@@ -366,10 +366,10 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
func tWindowsBlock() {
PopBlock := `C:\Progra~2\zhiwei\huorong_windows_block\PopBlock.exe`
if pub.NotExist(PopBlock) {
go pub.Msg(`火绒窗口拦截工具没有安装,请先从小工具中"软件安装"中进行安装`)
go Msg(`火绒窗口拦截工具没有安装,请先从小工具中"软件安装"中进行安装`)
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", "执行 其他工具-火绒窗口拦截工具")
}
......@@ -380,16 +380,16 @@ func tSoftwareInstall() {
if pub.NotExist(softpath) {
pub.Execcmd_wait("gpupdate /force /target:user")
}
softname := pub.ChooseFile("请选择安装包", softpath)
softname := chooseFile("请选择安装包", softpath)
if softname == "" {
return
}
if strings.HasPrefix(softname, softpath) {
softname = strings.TrimPrefix(softname, softpath)
go pub.Msg("正在复制安装包,请稍等!")
pub.SendServerExec(pub.GJexecInstallSoftware(softname))
go Msg("正在复制安装包,请稍等!")
pub.SendServerExec(pub.GJexecInstallSoftware(softname, User_sessionID))
} else {
go pub.Msg("安装失败:不是指定的文件路径!")
go Msg("安装失败:不是指定的文件路径!")
}
pub.LOG(INFO, "USERS_TOOLS", "执行 其他工具-软件安装")
......
......@@ -11,6 +11,7 @@ void getMouse()
import "C"
import (
pub "AD-Control-Golang/public"
reg "AD-Control-Golang/registry"
"fmt"
"os"
"time"
......@@ -18,6 +19,9 @@ import (
"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 ERROR = pub.ERROR
const NULL = pub.NULL
......@@ -81,7 +85,7 @@ func isActive() {
// 如果处于闲置状态
if ox == x && oy == y {
pub.MsgShutdown("即将关机,如需取消,点击小工具-电源管理-取消关机计时")
MsgShutdown("即将关机,如需取消,点击小工具-电源管理-取消关机计时")
}
}
......@@ -99,7 +103,7 @@ func userEnvInit() {
}
func main() {
if pub.Adserver() {
if pub.DomainCotroller() && pub.Windows() {
os.Exit(-1)
}
// 用户 初始化
......@@ -138,7 +142,7 @@ func main() {
pub.LOG(ERROR, NULL, err)
}
pub.MsgAdvUI(ni, "运维小工具已运行")
MsgAdvUI(ni, "运维小工具已运行")
timeout = time.Now()
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