Commit b22648bb by 陶腾飞

2022/04/22 v2.5.0

parent ba72a573
...@@ -96,6 +96,7 @@ ...@@ -96,6 +96,7 @@
- 2022/04/11 v2.3.2 添加对用户注销、登录时log记录与转发 - 2022/04/11 v2.3.2 添加对用户注销、登录时log记录与转发
- 2022/04/11 v2.3.3 修复用户注销的值错误、企业微信唤醒704局域网失败修复 - 2022/04/11 v2.3.3 修复用户注销的值错误、企业微信唤醒704局域网失败修复
- 2022/04/20 v2.4.0 添加知微运维平台的"远程登录"的获取远程信息功能 - 2022/04/20 v2.4.0 添加知微运维平台的"远程登录"的获取远程信息功能
- 2022/04/22 v2.5.0 添加人事账号管理功能
## 四、其他说明 ## 四、其他说明
......
...@@ -33,7 +33,7 @@ func mainInit() { ...@@ -33,7 +33,7 @@ func mainInit() {
pub.AD_User_ADControl = reg.Query_DC("ADControl") pub.AD_User_ADControl = reg.Query_DC("ADControl")
pub.AD_User_ADControl_key = reg.Query_DC("ADControl_key") pub.AD_User_ADControl_key = reg.Query_DC("ADControl_key")
pub.CmdbUrl = reg.Query_DC("cmdb_url") pub.CmdbUrl = reg.Query_DC("cmdb_url")
pub.Defult_user_key = reg.Query_DC("ad_default_user_key")
messionloop() messionloop()
} }
func main() { func main() {
......
...@@ -11,6 +11,7 @@ require ( ...@@ -11,6 +11,7 @@ require (
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.2 // indirect github.com/go-ldap/ldap/v3 v3.4.2 // indirect
github.com/gookit/color v1.5.0 // indirect github.com/gookit/color v1.5.0 // indirect
github.com/mozillazg/go-pinyin v0.19.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
......
...@@ -10,6 +10,8 @@ github.com/go-ldap/ldap/v3 v3.4.2 h1:zFZKcXKLqZpFMrMQGHeHWKXbDTdNCmhGY9AK41zPh+8 ...@@ -10,6 +10,8 @@ github.com/go-ldap/ldap/v3 v3.4.2 h1:zFZKcXKLqZpFMrMQGHeHWKXbDTdNCmhGY9AK41zPh+8
github.com/go-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= github.com/go-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg=
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c=
github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
......
...@@ -62,6 +62,34 @@ func cmdbKVtoJSON(k, v string) (string, error) { ...@@ -62,6 +62,34 @@ func cmdbKVtoJSON(k, v string) (string, error) {
return string(b), err return string(b), err
} }
func CmdbCheckOneRecord(k, v string) (bool, error) {
var count string = "1"
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)
LOG(DEBUG, CMDB, url)
var cir CIRecordReq
data, err := cmdbGET(url)
if err != nil {
LOG(ERROR, CMDB, err)
return false, err
}
if err := json.Unmarshal(data, &cir); err != nil {
LOG(ERROR, CMDB, err)
return false, err
}
LOG(DEBUG, "CMDB_EXITE", string(data))
switch cir.Numfound {
case 0:
return false, nil
case 1:
return true, nil
default:
return false, Error_CMDB_Many_Record
}
}
// 键值将上传到cmdb,如果存在返回ci,不存在将添加记录 // 键值将上传到cmdb,如果存在返回ci,不存在将添加记录
func cmdbExistRecord(k, v string) (int, bool) { func cmdbExistRecord(k, v string) (int, bool) {
......
...@@ -187,27 +187,27 @@ func (cir *CIRecordStartup) GetDept() (string, error) { ...@@ -187,27 +187,27 @@ func (cir *CIRecordStartup) GetDept() (string, error) {
} }
switch hostnameSplit[1] { switch hostnameSplit[1] {
case "JL": case "JL":
result = "巨量组" result = Dept_zw_qbmb_jl_string + Dept_group
case "ZJ": case "ZJ":
result = "字节组" result = Dept_zw_qbmb_zj_string + Dept_group
case "MT": case "MT":
result = "美团组" result = Dept_zw_qbmb_mt_string + Dept_group
case "DD": case "DD":
result = "滴滴组" result = Dept_zw_qbmb_dd_string + Dept_group
case "JR": case "JR":
result = "金融组" result = Dept_zw_qbmb_jr_string + Dept_group
case "TXHD": case "TXHD":
result = "腾讯互动组" result = Dept_zw_qbmb_txhd_string + Dept_group
case "TXWJ": case "TXWJ":
result = "腾讯危机组" result = Dept_zw_qbmb_txwj_string + Dept_group
case "JS": case "JS":
result = "技术组" result = Dept_zw_qbmb_js_string + Dept_group
case "JD": case "JD":
result = "京东组" result = Dept_zw_qbmb_jd_string + Dept_group
case "HW": case "HW":
result = "华为组" result = Dept_zw_qbmb_hw_string + Dept_group
case "BGYJ": case "BGYJ":
result = "报告研究中心" result = Dept_zw_qbmb_bgyj_string + Dept_group
default: default:
result = ERROR result = ERROR
} }
......
...@@ -4,8 +4,24 @@ import "fmt" ...@@ -4,8 +4,24 @@ import "fmt"
const Region_nb = "宁波" const Region_nb = "宁波"
const Region_zz = "郑州" const Region_zz = "郑州"
const Dept_jishu = "技术部门" const Dept_group = "组"
const Dept_chanpin = "产品部门" const Dept_zw_jishu = "技术部门"
const Dept_zw_chanpin = "产品部门"
const Dept_zw_qbmb = "情报部门"
const Dept_zw_qbmb_1 = "情报一部"
const Dept_zw_qbmb_2 = "情报二部"
const Dept_zw_qbmb_3 = "情报三部"
const Dept_zw_qbmb_jl_string = "巨量"
const Dept_zw_qbmb_zj_string = "字节"
const Dept_zw_qbmb_mt_string = "美团"
const Dept_zw_qbmb_dd_string = "滴滴"
const Dept_zw_qbmb_jr_string = "金融"
const Dept_zw_qbmb_txhd_string = "腾讯互动"
const Dept_zw_qbmb_txwj_string = "腾讯危机"
const Dept_zw_qbmb_js_string = "技术"
const Dept_zw_qbmb_jd_string = "京东"
const Dept_zw_qbmb_hw_string = "华为"
const Dept_zw_qbmb_bgyj_string = "报告研究中心"
func GetPostationFromHostname(hostname string) (string, error) { func GetPostationFromHostname(hostname string) (string, error) {
switch hostname { switch hostname {
......
...@@ -11,7 +11,7 @@ const SymbolHostname = "-" ...@@ -11,7 +11,7 @@ const SymbolHostname = "-"
// AD-Control // // AD-Control //
const Version string = "2.4.0" const Version string = "2.5.0"
const Host_adserver string = "ADSERVER" const Host_adserver string = "ADSERVER"
const Host_adserver_ip string = "192.168.0.20" const Host_adserver_ip string = "192.168.0.20"
const Host_thserver string = "THSERVER" const Host_thserver string = "THSERVER"
...@@ -28,8 +28,6 @@ var ZZServerLogDaemon string = Host_zzserver + DaemonLogListen ...@@ -28,8 +28,6 @@ var ZZServerLogDaemon string = Host_zzserver + DaemonLogListen
// users // // users //
const Users_Timeout int = 3
// user // // user //
var User_computername string = GetEnv("COMPUTERNAME") var User_computername string = GetEnv("COMPUTERNAME")
...@@ -89,6 +87,10 @@ var WxworkCorid string ...@@ -89,6 +87,10 @@ var WxworkCorid string
var WxworkCorpSecret string var WxworkCorpSecret string
var WxWorkAgentID string var WxWorkAgentID string
const WxWorkInteraction_RemoteTerminal = "请求远程终端"
const WxWorkInteraction_SignUP = "申请个人账号"
const WxWorkInteraction_Dimission = "停用个人账号"
// log level // // log level //
var Loglevel string = INFO var Loglevel string = INFO
...@@ -106,10 +108,11 @@ var CmdbUrl string ...@@ -106,10 +108,11 @@ var CmdbUrl string
var CmdbCITypeComputer string var CmdbCITypeComputer string
var AD_User_ADControl string var AD_User_ADControl string
var AD_User_ADControl_key string var AD_User_ADControl_key string
var Defult_user_key string
// RealTimeEnv // // RealTimeEnv //
const Opt_UserActivitydetection = "ADControl_UserActivitydetection" const Opt_UserActivitydetection = "option_UserActivitydetection"
const Opt_SendWX = "ADControl_SendWX" const Opt_SendWX = "option_SendWX"
var Opt_UserActivitydetection_state string var Opt_UserActivitydetection_state string
var Opt_SendWX_state string var Opt_SendWX_state string
...@@ -5,6 +5,7 @@ go 1.18 ...@@ -5,6 +5,7 @@ go 1.18
require ( require (
github.com/go-ldap/ldap/v3 v3.4.2 github.com/go-ldap/ldap/v3 v3.4.2
github.com/gookit/color v1.5.0 github.com/gookit/color v1.5.0
github.com/mozillazg/go-pinyin v0.19.0
golang.org/x/text v0.3.7 golang.org/x/text v0.3.7
) )
......
...@@ -10,6 +10,8 @@ github.com/go-ldap/ldap/v3 v3.4.2 h1:zFZKcXKLqZpFMrMQGHeHWKXbDTdNCmhGY9AK41zPh+8 ...@@ -10,6 +10,8 @@ github.com/go-ldap/ldap/v3 v3.4.2 h1:zFZKcXKLqZpFMrMQGHeHWKXbDTdNCmhGY9AK41zPh+8
github.com/go-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= github.com/go-ldap/ldap/v3 v3.4.2/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg=
github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c=
github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
......
package public package public
import ( import (
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
) )
// 获取 消息类型 // 获取 消息类型
func GetMsgType(b []byte) string { // func GetMsgType(b []byte) string {
//{"msgtype":"report","...":"..."} // //{"msgtype":"report","...":"..."}
// 提取第一个冒号后的第二位和第一个逗号的前一位 // // 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容 // // 也就是msgtype的内容
return string(b[bytes.IndexByte(b, ':')+2 : bytes.IndexByte(b, ',')-1]) // return string(b[bytes.IndexByte(b, ':')+2 : bytes.IndexByte(b, ',')-1])
} // }
// 解析Json 并放到变量中 // 解析Json 并放到变量中
func ParseJson(unmsg []byte, v interface{}) { func ParseJson(unmsg []byte, v interface{}) {
......
package public package public
import ( import (
"fmt"
ldap "github.com/go-ldap/ldap/v3" ldap "github.com/go-ldap/ldap/v3"
) )
//const ldap_qbbm string = "情报部门"
const ldap_lz string = "离职"
func ldapBase() (*ldap.Conn, error) { func ldapBase() (*ldap.Conn, error) {
l, err := ldap.DialURL("ldap://127.0.0.1:389") l, err := ldap.DialURL("ldap://127.0.0.1:389")
if err != nil { if err != nil {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
return nil, err return nil, err
} }
if err = l.Bind(AD_User_ADControl, AD_User_ADControl_key); err != nil { if err = l.Bind(AD_User_ADControl, AD_User_ADControl_key); err != nil {
...@@ -72,7 +76,32 @@ func LDAP_nameTopinyin(name string) string { ...@@ -72,7 +76,32 @@ func LDAP_nameTopinyin(name string) string {
} }
func LDAP_CheckExistName(name string) (bool, error) { func LDAP_ExistAccount_dimission(name string) (bool, error) {
var r bool
l, _ := ldapBase()
defer l.Close()
searchRequest := ldap.NewSearchRequest(
fmt.Sprintf("ou=%s,dc=zhiweireach,dc=com", ldap_lz),
ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0,
false,
"(cn="+name+")",
[]string{"cn"},
nil,
)
sr, err := l.Search(searchRequest)
if err != nil {
return false, err
}
if len(sr.Entries) == 0 {
r = false
} else {
r = true
}
return r, err
}
func LDAP_ExistAccount(name string) (bool, error) {
var r bool var r bool
l, _ := ldapBase() l, _ := ldapBase()
defer l.Close() defer l.Close()
......
...@@ -64,6 +64,8 @@ func DealMsg(msgtype, url string, unmsg []byte) []byte { ...@@ -64,6 +64,8 @@ func DealMsg(msgtype, url string, unmsg []byte) []byte {
func (rep *MJreport) MsgDeal() interface{} { func (rep *MJreport) MsgDeal() interface{} {
// 创建菜单调用工具:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10786
// 创建菜单官方说明:https://work.weixin.qq.com/api/doc/90000/90135/90231
switch rep.Instruction { switch rep.Instruction {
case Msg_Report_WillTurnOffPC: case Msg_Report_WillTurnOffPC:
...@@ -145,8 +147,97 @@ func (rep *MJreport) MsgDeal() interface{} { ...@@ -145,8 +147,97 @@ func (rep *MJreport) MsgDeal() interface{} {
MsgBox(rep.DataStr) MsgBox(rep.DataStr)
} }
} }
// 注册账号
case Msg_Report_SignUPUser:
switch rep.Status {
case Msg_status_commit:
SendWxworkTextToAdmins(rep.DataStr)
case Msg_status_deal:
msg := strings.Split(rep.DataStr, "\n")
//region := strings.Split(msg[1], "\n")[1]
dept := strings.Split(msg[2], ":")[1]
name := strings.Split(msg[3], ":")[1]
host := strings.Split(msg[4], ":")[1]
pinyin := NameToPinyin(name)
LOG(INFO, rep.Instruction, rep.DataStr)
// 判断 用户是否在离职目录中
dismission, err := LDAP_ExistAccount_dimission(name)
if err != nil {
LOG(ERROR, rep.Instruction, err)
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
if dismission {
LOG(ERROR, rep.Instruction, name+"存在于离职目录中")
rep.SendWXwork(name + "存在于离职目录中")
break
}
// 判断用户是否在其他目录中
b, err := LDAP_ExistAccount(name)
if err != nil {
LOG(ERROR, rep.Instruction, err)
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
if b {
LOG(ERROR, rep.Instruction, name+"已存在")
rep.SendWXwork(name + "已存在")
break
}
// 判断主机名是否在CMDB中
r, err := CmdbCheckOneRecord(Cmdb_Product_name, host)
if err != nil {
LOG(ERROR, rep.Instruction, err)
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
if !r {
LOG(ERROR, rep.Instruction, host+"不存在记录")
rep.SendWXwork(host + "不存在记录")
break
}
// 创建用户
out, err := PSCommandOutput(fmt.Sprintf(`New-ADUser -Enabled $True -Name "%s" -DisplayName "%s" -SamAccountName "%s" -ChangePasswordAtLogon $True -AccountPassword (ConvertTo-SecureString "%s" -AsPlainText -Force) -Path ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" ).DistinguishedName) -UserPrincipalName %s@zhiweireach.com`, name, name, pinyin, Defult_user_key, dept, pinyin))
if err != nil {
LOG(ERROR, rep.Instruction, fmt.Sprintf("%v\n%s", err, out))
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
// 如果创建完成,
rep.SendWXwork(name + "创建完成")
SendWxworkTextToAUser(rep.Username, name+"创建完成")
}
case Msg_Report_Dimission:
switch rep.Status {
case Msg_status_commit:
msg := strings.Split(rep.DataStr, "\n")
//region := strings.Split(msg[1], "\n")[1]
dept := strings.Split(msg[2], ":")[1]
name := strings.Split(msg[3], ":")[1]
if out, err := PSCommandOutput(fmt.Sprintf(`Get-ADUser -Filter 'Name -eq "%s"' -SearchBase ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" ).DistinguishedName) | disable-ADAccount`, name, dept)); err != nil {
LOG(ERROR, rep.Instruction, fmt.Sprintf("%v\n%s", err, out))
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
if out, err := PSCommandOutput(fmt.Sprintf(`Get-ADUser -Filter 'Name -eq "%s"' -SearchBase ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" ).DistinguishedName) | Move-ADObject -TargetPath ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" ).DistinguishedName)`, name, dept, ldap_lz)); err != nil {
LOG(ERROR, rep.Instruction, fmt.Sprintf("%v\n%s", err, out))
rep.SendWXwork(Error_WXWork_Fail_ReTry)
break
}
LOG(INFO, rep.Instruction, dept+name+" 移动成功")
rep.SendWXwork("处理完成")
}
default: default:
LOG(ERROR, "Default Report Json ", rep.Instruction) LOG(ERROR, "Default Report Json", rep.Instruction)
} }
// 修改状态 // 修改状态
...@@ -227,7 +318,8 @@ func (exec *MJexec) MsgDeal() interface{} { ...@@ -227,7 +318,8 @@ func (exec *MJexec) MsgDeal() interface{} {
case Msg_Exec_OpenRemoteTerminal: case Msg_Exec_OpenRemoteTerminal:
exec.Command = "powershell" exec.Command = "powershell"
SendWxworkTextToAdmins(exec.ToWXWrokAdmin()) msg := fmt.Sprintf("%s\nComputernName:%s\nCommand:%s\nSessionID:%s", WxWorkInteraction_RemoteTerminal, exec.Computername, exec.Command, exec.SessionID)
SendWxworkTextToAdmins(msg)
exec.Status = Msg_Exec_State_Over exec.Status = Msg_Exec_State_Over
case Msg_Exec_UserActivitydetection: case Msg_Exec_UserActivitydetection:
...@@ -335,7 +427,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -335,7 +427,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
case WXEK_zwDevopsPowerWake: case WXEK_zwDevopsPowerWake:
wxwork.SendText("收到唤醒指令,正在处理!") wxwork.SendText("收到唤醒指令,正在处理!")
if c, err := LDAP_CheckExistName(wxwork.Name); err != nil { if c, err := LDAP_ExistAccount(wxwork.Name); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
} else { } else {
if !c { if !c {
...@@ -391,7 +483,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -391,7 +483,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
case WXEK_zwDevopsPowerReboot: case WXEK_zwDevopsPowerReboot:
wxwork.SendText("收到重启指令,正在处理") wxwork.SendText("收到重启指令,正在处理")
if c, err := LDAP_CheckExistName(wxwork.Name); err != nil { if c, err := LDAP_ExistAccount(wxwork.Name); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
} else { } else {
if !c { if !c {
...@@ -450,7 +542,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -450,7 +542,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
case WXEK_zwDevopsPowerTurnOFF: case WXEK_zwDevopsPowerTurnOFF:
wxwork.SendText("收到关机指令,正在处理!") wxwork.SendText("收到关机指令,正在处理!")
if c, err := LDAP_CheckExistName(wxwork.Name); err != nil { if c, err := LDAP_ExistAccount(wxwork.Name); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
} else { } else {
if !c { if !c {
...@@ -507,7 +599,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -507,7 +599,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
case WXEK_zwDevopsPowerStatus: case WXEK_zwDevopsPowerStatus:
wxwork.SendText("收到查询指令,正在处理!") wxwork.SendText("收到查询指令,正在处理!")
if c, err := LDAP_CheckExistName(wxwork.Name); err != nil { if c, err := LDAP_ExistAccount(wxwork.Name); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
} else { } else {
if !c { if !c {
...@@ -546,7 +638,7 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -546,7 +638,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
// 获取远程信息 // 获取远程信息
case WXEK_zwDevopsPemoteGetinfo: case WXEK_zwDevopsPemoteGetinfo:
if c, err := LDAP_CheckExistName(wxwork.Name); err != nil { if c, err := LDAP_ExistAccount(wxwork.Name); err != nil {
LOG(ERROR, wxwork.Instruction, err) LOG(ERROR, wxwork.Instruction, err)
} else { } else {
if !c { if !c {
...@@ -571,16 +663,40 @@ func (wxwork *MJwxwork) MsgDealSend() { ...@@ -571,16 +663,40 @@ func (wxwork *MJwxwork) MsgDealSend() {
wxwork.Result = fmt.Sprintf("您的主机IP地址为%s", ip) wxwork.Result = fmt.Sprintf("您的主机IP地址为%s", ip)
default: default:
LOG(INFO, "WXWORK", fmt.Sprintf("%s:%s", wxwork.Name, wxwork.Content)) if wxwork.Name == "陶腾飞" || wxwork.Name == "边爽" {
switch wxwork.Name {
case "陶腾飞":
if strings.Contains(wxwork.Content, "\n") { if strings.Contains(wxwork.Content, "\n") {
PsExec_sdi(wxwork.SplitMessage()) msgtype := strings.Split(wxwork.Content, "\n")[0]
switch msgtype {
case WxWorkInteraction_RemoteTerminal:
PsExec_sdi(wxwork.SplitMessage())
case WxWorkInteraction_SignUP:
var rep MJreport
rep.Init(Msg_Report_SignUPUser)
rep.Status = Msg_status_deal
rep.Username = wxwork.Name
rep.WxUser = wxwork.UserID
rep.DataStr = wxwork.Content
SendADMsg(Msg_Report, rep)
case WxWorkInteraction_Dimission:
var rep MJreport
rep.Init(Msg_Report_Dimission)
rep.Status = Msg_status_commit
rep.Username = wxwork.Name
rep.WxUser = wxwork.UserID
rep.DataStr = wxwork.Content
SendADMsg(Msg_Report, rep)
default:
wxwork.Result = fmt.Sprintf("%s 不是有效的", msgtype)
}
} }
default: } else {
wxwork.SendText("【自动回复】\n电脑问题请找技术部运维组陶腾飞。联系方式:17815918180(同微信)") wxwork.SendText("【自动回复】\n电脑问题请找技术部运维组陶腾飞。联系方式:17815918180(同微信)")
} }
} }
wxwork.SendResult() wxwork.SendResult()
} }
package public package public
import ( import (
"fmt"
"strings" "strings"
) )
...@@ -31,6 +30,8 @@ const TurnOffPC string = "TurnOffPC" ...@@ -31,6 +30,8 @@ const TurnOffPC string = "TurnOffPC"
const WillTurnOnPC string = "WillTurnOnPC" const WillTurnOnPC string = "WillTurnOnPC"
const WillTurnOffPC string = "WillTurnOffPC" const WillTurnOffPC string = "WillTurnOffPC"
const UpdatePrimaryHost string = "UpdatePrimaryHost" const UpdatePrimaryHost string = "UpdatePrimaryHost"
const SignUPUser string = "SignUPUser"
const Dimission string = "Dimission"
// msg report type /////////////////////////////////////////////////////////// // msg report type ///////////////////////////////////////////////////////////
...@@ -43,6 +44,8 @@ const Msg_Report_TurnOffPC string = TurnOffPC ...@@ -43,6 +44,8 @@ const Msg_Report_TurnOffPC string = TurnOffPC
const Msg_Report_WillTurnOnPC string = WillTurnOnPC const Msg_Report_WillTurnOnPC string = WillTurnOnPC
const Msg_Report_WillTurnOffPC string = WillTurnOffPC const Msg_Report_WillTurnOffPC string = WillTurnOffPC
const Msg_Report_UpdatePrimaryHost string = UpdatePrimaryHost const Msg_Report_UpdatePrimaryHost string = UpdatePrimaryHost
const Msg_Report_SignUPUser string = SignUPUser
const Msg_Report_Dimission string = Dimission
// msg exec type //////////////////////////////////////////////////////////////// // msg exec type ////////////////////////////////////////////////////////////////
...@@ -101,6 +104,7 @@ type MJbase struct { ...@@ -101,6 +104,7 @@ type MJbase struct {
// report Json Format ////////////////////////////////////////////////////// // report Json Format //////////////////////////////////////////////////////
type MJreport struct { type MJreport struct {
WxUser string `json:"wxuser"`
MJbase MJbase
} }
...@@ -142,26 +146,34 @@ type MJwxwork struct { ...@@ -142,26 +146,34 @@ type MJwxwork struct {
// Report // Report
func GJreportString(s string, d string) interface{} { func GJreportString(s string, d string) interface{} {
var rep MJreport var rep MJreport
rep.init(s) rep.Init(s)
rep.DataStr = d rep.DataStr = d
return rep return rep
} }
func GJreportUsernameString(s string, n string, d string) interface{} { func GJreportUsernameString(s string, n string, d string) interface{} {
var rep MJreport var rep MJreport
rep.init(s) rep.Init(s)
rep.Username = n rep.Username = n
rep.DataStr = d rep.DataStr = d
return rep return rep
} }
func GJreportStringStatus(s string, status string) interface{} {
var rep MJreport
rep.Init(s)
rep.DataStr = status
rep.Status = status
return rep
}
func GJreport(s string) interface{} { func GJreport(s string) interface{} {
var rep MJreport var rep MJreport
rep.init(s) rep.Init(s)
return rep return rep
} }
func (rep *MJreport) Pskill(cmd string) { func (rep *MJreport) Pskill(cmd string) {
Pskill(rep.Computername, cmd) Pskill(rep.Computername, cmd)
} }
func (rep *MJreport) init(Report string) { func (rep *MJreport) Init(Report string) {
rep.Username = User_name rep.Username = User_name
rep.Computername = User_computername rep.Computername = User_computername
rep.Status = Msg_status_commit rep.Status = Msg_status_commit
...@@ -169,6 +181,11 @@ func (rep *MJreport) init(Report string) { ...@@ -169,6 +181,11 @@ func (rep *MJreport) init(Report string) {
rep.Instruction = Report rep.Instruction = Report
rep.Version = Version rep.Version = Version
} }
func (rep *MJreport) SendWXwork(s string) {
if err := SendWxworkTextToAUser(rep.WxUser, s); err != nil {
LOG(ERROR, "", err)
}
}
// Exec // Exec
...@@ -203,9 +220,6 @@ func (exec *MJexec) Init(s string, id string) { ...@@ -203,9 +220,6 @@ func (exec *MJexec) Init(s string, id string) {
func (exec *MJexec) PsExec() { func (exec *MJexec) PsExec() {
PsExec_sd(exec.Computername, exec.Command) PsExec_sd(exec.Computername, exec.Command)
} }
func (exec *MJexec) ToWXWrokAdmin() string {
return fmt.Sprintf("ComputernName:%s\nCommand:%s\nSessionID:%s", exec.Computername, exec.Command, exec.SessionID)
}
// wake // wake
...@@ -238,5 +252,5 @@ func (wxwork *MJwxwork) SendResult() { ...@@ -238,5 +252,5 @@ func (wxwork *MJwxwork) SendResult() {
func (wxwork *MJwxwork) SplitMessage() (string, string, string) { func (wxwork *MJwxwork) SplitMessage() (string, string, string) {
s := strings.Split(wxwork.Content, "\n") s := strings.Split(wxwork.Content, "\n")
return strings.Split(s[0], ":")[1], strings.Split(s[1], ":")[1], strings.Split(s[2], ":")[1] return strings.Split(s[1], ":")[1], strings.Split(s[2], ":")[1], strings.Split(s[3], ":")[1]
} }
...@@ -54,8 +54,8 @@ func SendMsg(server, msgtype string, v interface{}) { ...@@ -54,8 +54,8 @@ func SendMsg(server, msgtype string, v interface{}) {
LOG(ERROR, NULL, err) LOG(ERROR, NULL, err)
} }
// 处理数据 // 处理数据
if len(body) > 0 { if len(body) > 0 && string(body) != "null" {
DealMsg(GetMsgType(body), "", body) DealMsg(msgtype, "", body)
} }
} }
...@@ -129,7 +129,10 @@ func SendWX(Content string) { ...@@ -129,7 +129,10 @@ func SendWX(Content string) {
}`) }`)
http.Post(WxworkBotLink, "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 {
// 发送应用消息(
// https://developer.work.weixin.qq.com/document/path/90236
func SendWxworkTextToAUser(nameOrID, text string) error {
// 获取 最新 token // 获取 最新 token
t, err := GetWXWorkToken() t, err := GetWXWorkToken()
...@@ -140,9 +143,9 @@ func SendWxworkTextToAUser(id, text string) error { ...@@ -140,9 +143,9 @@ func SendWxworkTextToAUser(id, text string) error {
// 初始化 消息推送 结构体 // 初始化 消息推送 结构体
var wsmt WxSendMsgText var wsmt WxSendMsgText
wsmt.Init() wsmt.Init()
wsmt.Touser = id wsmt.Touser = nameOrID
wsmt.Text.Content = text wsmt.Text.Content = text
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s", t) link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s&debug=1", t)
// 发送 Post 请求 // 发送 Post 请求
res, err := SendPostRequestWithData(&link, &wsmt) res, err := SendPostRequestWithData(&link, &wsmt)
...@@ -153,14 +156,20 @@ func SendWxworkTextToAUser(id, text string) error { ...@@ -153,14 +156,20 @@ func SendWxworkTextToAUser(id, text string) error {
// 解析 Post 响应 数据 // 解析 Post 响应 数据
var wsmr WxSendMsgRec var wsmr WxSendMsgRec
ParseJson(res, &wsmr) ParseJson(res, &wsmr)
if wsmr.ErrCode == 81013 {
LOG(ERROR, "", "接收人无权限或不存在")
}
if wsmr.ErrCode != 0 { if wsmr.ErrCode != 0 {
return fmt.Errorf("%s", wsmr.ErrMsg) return fmt.Errorf("%s", wsmr.ErrMsg)
} }
return nil return nil
} }
func SendWxworkTextToAdmins(text string) error { func SendWxworkTextToAdmins(nameOrID string) error {
return SendWxworkTextToAUser("TaoTengFei", text) return SendWxworkTextToAUser("TaoTengFei", nameOrID)
}
func SendWxworkTextToHR(nameOrID string) error {
return SendWxworkTextToAUser("BianShuang", nameOrID)
} }
// 根据主机位置定义发送的服务器 // 根据主机位置定义发送的服务器
......
...@@ -2,30 +2,46 @@ package public ...@@ -2,30 +2,46 @@ package public
import ( import (
"math/rand" "math/rand"
"strconv"
"time" "time"
) )
// const time_layout string = "2006-01-02 15:04:05 Monday"
//
// time func
//
// 获取当前时间戳 // 获取当前时间戳
func NowTimestamp() int64 { func NowTimestamp() int64 {
return time.Now().Unix() return time.Now().Unix()
} }
// 获取当前时间戳 返回string
func NowTimestampString() string {
return strconv.FormatInt(time.Now().Unix(), 10)
}
// 获取毫秒级时间戳
func NowTimestampNano() int64 { func NowTimestampNano() int64 {
return time.Now().UnixNano() return time.Now().UnixNano()
} }
// 将时间戳解析成字符串 // 将 int64的时间戳 解析为 字符串
func UnixTimeParse(t *int64) string { func UnixTimeParse(t int64) string {
return time.Unix(*t, 0).String() return time.Unix(t, 0).String()
}
// 将 int64的时间戳 解析为 时间结构体
func UnixTimeParseTime(t int64) (time.Time, error) {
return time.Parse(time.Unix(t, 0).String(), time_layout)
}
// 将 string的时间戳 解析为 时间结构体
func UnixTimeParseTimeFromString(s string) time.Time {
t, _ := strconv.ParseInt(s, 10, 64)
return time.Unix(t, 0)
} }
// 获取 字符串格式化 时间 // 获取 字符串格式化 时间
func GetNowTimeString() string { func GetNowTimeString() string {
return time.Now().Format("2006-01-02 15:04:05 Monday") return time.Now().Format(time_layout)
} }
// 输出当前小时 // 输出当前小时
...@@ -40,18 +56,11 @@ func GetDateHour() (int, int) { ...@@ -40,18 +56,11 @@ func GetDateHour() (int, int) {
h, _, _ := t.Clock() h, _, _ := t.Clock()
return d, h return d, h
} }
func ParseTime(s string) (time.Time, error) {
return time.Parse("2006-01-02 15:04:05 Monday", s)
}
func IfBeforeMin(target time.Time, m int) bool { func IfBeforeMin(target time.Time, m int) bool {
return target.Add(time.Duration(m) * time.Minute).After(time.Now()) return target.Add(time.Duration(m) * time.Minute).Before(time.Now())
} }
//
//
// other func
//
// 返回 随机数 // 返回 随机数
func Rand(i *int) int { func Rand(i *int) int {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
......
...@@ -5,6 +5,8 @@ import ( ...@@ -5,6 +5,8 @@ import (
"os" "os"
"runtime" "runtime"
"strings" "strings"
"github.com/mozillazg/go-pinyin"
) )
const HOST_Region_NB string = "NB" const HOST_Region_NB string = "NB"
...@@ -47,7 +49,7 @@ func Windows() bool { ...@@ -47,7 +49,7 @@ func Windows() bool {
} }
func PublicUser() bool { func PublicUser() bool {
return strings.Contains(User_name_display, "专用账") return strings.Contains(User_name_display, "专用账")
} }
// computer // computer
...@@ -92,3 +94,6 @@ func GetIPFromInterface() { ...@@ -92,3 +94,6 @@ func GetIPFromInterface() {
func Zhiweireach() bool { func Zhiweireach() bool {
return User_userdomain == "ZHIWEIREACH" return User_userdomain == "ZHIWEIREACH"
} }
func NameToPinyin(s string) string {
return strings.Join(pinyin.LazyConvert(s, nil), "")
}
...@@ -172,7 +172,7 @@ func PSCommandOutput(cmd string) (string, error) { ...@@ -172,7 +172,7 @@ func PSCommandOutput(cmd string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
r, err := exec.Command(app, appargs...).Output() r, err := exec.Command(app, appargs...).CombinedOutput()
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -180,8 +180,7 @@ func PSCommandOutput(cmd string) (string, error) { ...@@ -180,8 +180,7 @@ func PSCommandOutput(cmd string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
return string(out), nil return strings.TrimSpace(string(out)), nil
} }
func PSCommandOutputNoSplit(cmd string) (string, error) { func PSCommandOutputNoSplit(cmd string) (string, error) {
cmd = "powershell -command " + cmd cmd = "powershell -command " + cmd
...@@ -189,7 +188,7 @@ func PSCommandOutputNoSplit(cmd string) (string, error) { ...@@ -189,7 +188,7 @@ func PSCommandOutputNoSplit(cmd string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
out, err := exec.Command(app, appargs...).Output() out, err := exec.Command(app, appargs...).CombinedOutput()
if err != nil { if err != nil {
return "", err return "", err
} }
......
...@@ -66,8 +66,6 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -66,8 +66,6 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// 企业微信 消息 处理 // 企业微信 消息 处理
// wxmsg.Content是接收到的文本消息ID // wxmsg.Content是接收到的文本消息ID
// wxmsg.EventKey是菜单事件 // wxmsg.EventKey是菜单事件
// 创建菜单调用工具:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10786
// 创建菜单官方说明:https://work.weixin.qq.com/api/doc/90000/90135/90231
w.Instruction = wxmsg.EventKey w.Instruction = wxmsg.EventKey
w.UserID = wxmsg.FromUsername w.UserID = wxmsg.FromUsername
w.Name = name w.Name = name
...@@ -104,8 +102,8 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork { ...@@ -104,8 +102,8 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// return string(cryptMsg) // return string(cryptMsg)
} }
// 读取企业通讯录的成员信息 // 读取企业通讯录的成员信息(需要管理员登录)
// 官方说明: https://work.weixin.qq.com/api/doc/90000/90135/90196 // https://work.weixin.qq.com/api/doc/90000/90135/90196
func GetBricklayerName(token, userid string) (string, error) { func GetBricklayerName(token, userid string) (string, error) {
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s", token, userid) link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s", token, userid)
data, err := SendGetRequest(&link) data, err := SendGetRequest(&link)
......
...@@ -14,36 +14,35 @@ const ( ...@@ -14,36 +14,35 @@ const (
HKU HKU
) )
var Error_Null_Reg_Query = errors.New("Not Found Reg Query Result") var Error_Null_Reg_Query = errors.New("not found reg query result")
const reg_LM_ADCONTROL string = `software\AD-Control` const REG_ADCONTROL string = `software\AD-Control`
// reg func for domain computer // reg func for domain computer
func Write_DC(key, value string) { func Write_DC(key, value string) {
Write_key_one(HKLM, reg_LM_ADCONTROL, key, value) Write_key_one(HKLM, REG_ADCONTROL, key, value)
} }
func Query_DC(key string) string { func Query_DC(key string) string {
return Query_key_one(HKLM, reg_LM_ADCONTROL, key) return Query_key_one(HKLM, REG_ADCONTROL, key)
} }
// reg func for AD // reg func for AD
func Query_ADPC(pc, key string) string { func Write_ADPC(key, value string) {
// coding Exist_item(HKCU, REG_ADCONTROL)
return "" Write_key_one(HKCU, REG_ADCONTROL, key, value)
} }
func Write_ADDC(pc, key, value string) { func Query_ADPC(key string) string {
// coding Exist_item(HKCU, REG_ADCONTROL)
return Query_key_one(HKCU, REG_ADCONTROL, key)
} }
func Exist_item(root int, path string) { func Exist_item(root int, path string) {
registry.CreateKey(prase(&root), path, registry.ALL_ACCESS) registry.CreateKey(prase(&root), path, registry.ALL_ACCESS)
} }
func IfExist_item(root int, path string) error { func IfExist_item(root int, path string) error {
k, err := registry.OpenKey(prase(&root), path, registry.READ) _, err := registry.OpenKey(prase(&root), path, registry.READ)
defer k.Close()
return err return err
} }
func Query_item_one(root int, path string) string { func Query_item_one(root int, path string) string {
......
...@@ -17,6 +17,7 @@ require ( ...@@ -17,6 +17,7 @@ require (
github.com/go-ldap/ldap/v3 v3.4.2 // indirect github.com/go-ldap/ldap/v3 v3.4.2 // indirect
github.com/gookit/color v1.5.0 // indirect github.com/gookit/color v1.5.0 // indirect
github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
github.com/mozillazg/go-pinyin v0.19.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
......
...@@ -14,6 +14,8 @@ github.com/lxn/walk v0.0.0-20210112085537-c389da54e794 h1:NVRJ0Uy0SOFcXSKLsS65Om ...@@ -14,6 +14,8 @@ github.com/lxn/walk v0.0.0-20210112085537-c389da54e794 h1:NVRJ0Uy0SOFcXSKLsS65Om
github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ=
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
github.com/mozillazg/go-pinyin v0.19.0 h1:p+J8/kjJ558KPvVGYLvqBhxf8jbZA2exSLCs2uUVN8c=
github.com/mozillazg/go-pinyin v0.19.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
......
...@@ -7,12 +7,15 @@ import ( ...@@ -7,12 +7,15 @@ import (
"time" "time"
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public" pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
reg "git.zhiweidata.top/taotengfei/AD-Control-Golang/registry"
"github.com/lxn/walk" "github.com/lxn/walk"
. "github.com/lxn/walk/declarative" . "github.com/lxn/walk/declarative"
) )
var timeout time.Time const Reg_Signup string = "t_signup"
const Reg_RemoteTerminal string = "t_remoteterminal"
const timeout int = 1
func menuInitName(ni *walk.NotifyIcon) { func menuInitName(ni *walk.NotifyIcon) {
...@@ -124,14 +127,100 @@ func menuInitAccountManager(ni *walk.NotifyIcon) { ...@@ -124,14 +127,100 @@ func menuInitAccountManager(ni *walk.NotifyIcon) {
sysmenu.SetEnabled(true) sysmenu.SetEnabled(true)
} }
type signUpStruct struct {
Name *walk.LineEdit
Dept *walk.ComboBox
}
// 账号管理 申请个人账号 // 账号管理 申请个人账号
func tAccountManagerSignUP() { func tAccountManagerSignUP() {
if !pub.PublicUser() { if !pub.PublicUser() {
Msg("您已经正在使用个人账号!") Msg("您已经正在使用个人账号!")
return return
} }
Msg("功能开发中") var signUp signUpStruct
if _, err := (MainWindow{
Title: "隐藏/显示桌面图标",
MinSize: Size{Width: 300, Height: 400},
Size: Size{Width: 300, Height: 400},
Layout: VBox{},
Children: []Widget{
VSplitter{
Children: []Widget{
GroupBox{
Layout: HBox{},
Children: []Widget{
Label{
Text: "姓名",
},
LineEdit{
MinSize: Size{Width: 40, Height: 0},
AssignTo: &signUp.Name,
},
},
},
GroupBox{
Layout: HBox{},
Children: []Widget{
Label{
Text: "部门",
},
ComboBox{
AssignTo: &signUp.Dept,
Model: []string{pub.Dept_zw_qbmb_jl_string, pub.Dept_zw_qbmb_zj_string, pub.Dept_zw_qbmb_mt_string, pub.Dept_zw_qbmb_dd_string, pub.Dept_zw_qbmb_jr_string, pub.Dept_zw_qbmb_txhd_string, pub.Dept_zw_qbmb_txwj_string, pub.Dept_zw_qbmb_jd_string, pub.Dept_zw_qbmb_hw_string, pub.Dept_zw_qbmb_bgyj_string},
CurrentIndex: 0, // 默认选中第一个
},
},
},
PushButton{
Text: "提交",
OnClicked: signUp.signUpPush,
},
},
},
},
}.Run()); err != nil {
pub.LOG(ERROR, "", err)
}
}
func (signUp *signUpStruct) signUpPush() {
var Reg_target string = Reg_Signup
var t time.Time
var exec bool
name := signUp.Name.Text()
dept := signUp.Dept.Text()
if name == "" {
Msg("请输入姓名")
}
host, _ := pub.GetHostnamePart(pub.User_computername)
var region string
switch host[0] {
case pub.HOST_Region_NB:
region = pub.Region_nb
case pub.HOST_Region_ZZ:
region = pub.Region_zz
}
if reg_t := reg.Query_ADPC(Reg_target); reg_t == "" {
exec = true
} else {
t = pub.UnixTimeParseTimeFromString(reg_t)
exec = pub.IfBeforeMin(t, timeout)
}
if !exec {
Msg(`暂时无法使用,稍后重试!`)
return
}
l := fmt.Sprintf("地区:%s\n部门:%s\n姓名:%s", region, dept, name)
if Msg_YesNo(l + "\n\n是否确定消息无误?") {
l = fmt.Sprintf("%s\n%s\n主机名:%s", pub.WxWorkInteraction_SignUP, l, pub.User_computername)
pub.SendADMsg(pub.Msg_Report, pub.GJreportString(pub.Msg_Report_SignUPUser, l))
reg.Write_ADPC(Reg_target, pub.NowTimestampString())
}
} }
// 主机管理 // 主机管理
...@@ -184,7 +273,7 @@ func menuInitHostManager(ni *walk.NotifyIcon) { ...@@ -184,7 +273,7 @@ func menuInitHostManager(ni *walk.NotifyIcon) {
// 主机管理 绑定主机 // 主机管理 绑定主机
func tHostManagerBind() { func tHostManagerBind() {
if r := Msg_YesNo(`执行本操作后,通过企业微信的"知微运维平台"的电源管理的主机将是本机。`); r != 1 { if Msg_YesNo(`执行本操作后,通过企业微信的"知微运维平台"的电源管理的主机将是本机。`) {
return return
} }
var ph pub.CIRecordUpdateTime var ph pub.CIRecordUpdateTime
...@@ -200,14 +289,28 @@ func tHostManagerBind() { ...@@ -200,14 +289,28 @@ func tHostManagerBind() {
pub.SendADMsg(pub.Msg_Report, pub.GJreportUsernameString(pub.Msg_Report_UpdatePrimaryHost, pub.User_name_display, string(d))) pub.SendADMsg(pub.Msg_Report, pub.GJreportUsernameString(pub.Msg_Report_UpdatePrimaryHost, pub.User_name_display, string(d)))
} }
// 主机管理 请求终端
func tHostManagerTerminal() { func tHostManagerTerminal() {
if pub.IfBeforeMin(timeout, pub.Users_Timeout) { var Reg_target string = Reg_RemoteTerminal
Msg(`暂时无法使用!`) var t time.Time
var exec bool
if reg_t := reg.Query_ADPC(Reg_target); reg_t == "" {
exec = true
} else {
t = pub.UnixTimeParseTimeFromString(reg_t)
exec = pub.IfBeforeMin(t, timeout)
}
if !exec {
Msg(`暂时无法使用,稍后重试!`)
return return
} }
if r := Msg_YesNo(`非管理人员,请勿使用!`); r == 1 {
timeout = time.Now() if Msg_YesNo(`非管理人员,请勿使用!`) {
pub.SendServerExec(pub.GJexec(pub.Msg_Exec_OpenRemoteTerminal, User_sessionID)) pub.SendServerExec(pub.GJexec(pub.Msg_Exec_OpenRemoteTerminal, User_sessionID))
reg.Write_ADPC(Reg_target, pub.NowTimestampString())
} }
} }
...@@ -314,8 +417,8 @@ func tHideShowIcon() { ...@@ -314,8 +417,8 @@ func tHideShowIcon() {
if _, err := (MainWindow{ if _, err := (MainWindow{
AssignTo: &mw.MainWindow, AssignTo: &mw.MainWindow,
Title: "隐藏/显示桌面图标", Title: "隐藏/显示桌面图标",
MinSize: Size{300, 400}, MinSize: Size{Width: 300, Height: 400},
Size: Size{300, 400}, Size: Size{Width: 300, Height: 400},
Layout: VBox{}, Layout: VBox{},
Children: []Widget{ Children: []Widget{
ListBox{ ListBox{
...@@ -408,7 +511,7 @@ func tSoftwareInstall() { ...@@ -408,7 +511,7 @@ func tSoftwareInstall() {
pub.LOG(INFO, "USERS_TOOLS", "执行 工具集合-软件安装") pub.LOG(INFO, "USERS_TOOLS", "执行 工具集合-软件安装")
} }
// 文件共享 (包含大屏主机的文件共享) // 文件共享 会议室大屏主机
func menuInitFileShares(ni *walk.NotifyIcon) { func menuInitFileShares(ni *walk.NotifyIcon) {
fa := "文件共享" fa := "文件共享"
...@@ -420,13 +523,13 @@ func menuInitFileShares(ni *walk.NotifyIcon) { ...@@ -420,13 +523,13 @@ func menuInitFileShares(ni *walk.NotifyIcon) {
// 添加 // 添加
na := walk.NewAction() na := walk.NewAction()
if err := na.SetText("会议室的大脸机"); err != nil { if err := na.SetText("会议室大屏主机"); err != nil {
pub.LOG(pub.ERROR, NULL, err) pub.LOG(pub.ERROR, NULL, err)
} else { } else {
//将菜单添加到托盘 //将菜单添加到托盘
na.Triggered().Attach(func() { na.Triggered().Attach(func() {
pub.OpenWindow(`ftp://adserver`) pub.OpenWindow(`ftp://adserver`)
pub.LOG(INFO, "USERS_SHARE", "执行 文件共享-会议室的大脸机") pub.LOG(INFO, "USERS_SHARE", "执行 文件共享-会议室大屏主机")
}) })
if err := mfs.Actions().Add(na); err != nil { if err := mfs.Actions().Add(na); err != nil {
pub.LOG(pub.ERROR, NULL, err) pub.LOG(pub.ERROR, NULL, err)
......
...@@ -12,7 +12,6 @@ import "C" ...@@ -12,7 +12,6 @@ import "C"
import ( import (
"fmt" "fmt"
"os" "os"
"time"
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public" pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
reg "git.zhiweidata.top/taotengfei/AD-Control-Golang/registry" reg "git.zhiweidata.top/taotengfei/AD-Control-Golang/registry"
...@@ -105,7 +104,10 @@ func userEnvInit() { ...@@ -105,7 +104,10 @@ func userEnvInit() {
} }
func main() { func main() {
if pub.DomainCotroller() && pub.Windows() { if !pub.Windows() {
os.Exit(-1)
}
if pub.DomainCotroller() {
os.Exit(-1) os.Exit(-1)
} }
// 用户 初始化 // 用户 初始化
...@@ -145,9 +147,8 @@ func main() { ...@@ -145,9 +147,8 @@ func main() {
} }
MsgAdvUI(ni, "运维小工具已运行") MsgAdvUI(ni, "运维小工具已运行")
timeout = time.Now()
pub.LOG(INFO, NULL, fmt.Sprintf("users verson:%s start!", pub.Version)) pub.LOG(INFO, NULL, fmt.Sprintf("users start! version:%s", pub.Version))
// 循环 运行窗体 // 循环 运行窗体
mw.Run() mw.Run()
......
...@@ -27,8 +27,8 @@ func Msg(message string) { ...@@ -27,8 +27,8 @@ func Msg(message string) {
// UI:显示带确定和取消的消息框 // UI:显示带确定和取消的消息框
// 点击确定按钮:返回1, // 点击确定按钮:返回1,
// 点击取消按钮:返回2 // 点击取消按钮:返回2
func Msg_YesNo(message string) int { func Msg_YesNo(message string) bool {
return walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxOKCancel) return walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxOKCancel) == 1
} }
// 高级UI提示消息 // 高级UI提示消息
......
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