Commit 654776f7 by 陶腾飞

2022/07/22 v2.6.0

parent c29b95e2
......@@ -104,8 +104,9 @@
- 2022/04/29 v2.5.5 ci工具 自我升级
- 2022/05/26 v2.5.6 更新主要计算机功能bug修复
- 2022/06/14 v2.5.7 更新日志输出、删除情报一二三部
- 2022/07/6 v2.5.8 增加抖音组,解决walk的反射问题,优化软件安装的下载速度
- 2022/07/7 v2.5.9 隐藏下载软件的窗口,
- 2022/07/06 v2.5.8 增加抖音组,解决walk的反射问题,优化软件安装的下载速度
- 2022/07/07 v2.5.9 隐藏下载软件的窗口
- 2022/07/22 v2.6.0 使用企业微信作为注册个人账号的验证方式
## 四、其他说明
......
package main
import (
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
"log"
"encoding/json"
"flag"
"fmt"
"os"
"strings"
pub "git.zhiweidata.top/taotengfei/AD-Control-Golang/public"
. "github.com/lxn/walk/declarative"
)
const INFO = pub.INFO
......@@ -66,7 +69,10 @@ func main() {
} else if *wolPartText != "" {
pub.DomainCotroller()
wolPart(*wolPartText)
} else {
gui()
}
}
func loglevelSet(l string) {
switch l {
......@@ -157,3 +163,22 @@ func wolALL() {
func wolPart(p string) {
pub.SendADMsg(pub.Msg_Wake, pub.GJwakeList(p))
}
func gui() {
if _, err := (MainWindow{
Title: "软件安装",
MinSize: Size{Width: 150, Height: 100},
Size: Size{Width: 150, Height: 100},
Layout: VBox{MarginsZero: true}, // 请勿删除
Children: []Widget{
PushButton{
Text: "初始化域计算机",
OnClicked: guiInitDC,
},
},
}.Run()); err != nil {
log.Fatal(err)
}
}
func guiInitDC() {
}
module adct
go 1.18
require git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
go 1.17
replace git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0 => ..\public
require (
git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
github.com/lxn/walk v0.0.0-20210112085537-c389da54e794
)
require (
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.2 // indirect
github.com/gookit/color v1.5.0 // 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
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
golang.org/x/text v0.3.7 // indirect
gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect
)
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
......@@ -10,6 +12,10 @@ 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/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw=
github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo=
github.com/lxn/walk v0.0.0-20210112085537-c389da54e794 h1:NVRJ0Uy0SOFcXSKLsS65OmI1sgCCfiDUPj+cwnH7GZw=
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/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=
......@@ -24,14 +30,25 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 h1:PgUUmg0gNMIPY2WafhL/oLyQGw+kdTNPlVWOjltpp3w=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc=
gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv1:assemblyIdentity name="adct..exe" version="1.10.2.0" publicKeyToken="0000000000000000" language="非特定语言" processorArchitecture="msil" type="win32" />
<description asmv2:publisher="知微" asmv2:product="域控制中心" xmlns="urn:schemas-microsoft-com:asm.v1" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
</windowsSettings>
</application>
</assembly>
\ No newline at end of file
......@@ -16,15 +16,19 @@ func messionloop() {
// 若通道为空,则阻塞
// 若通道有数据,则读取
// 若通道关闭,则退出
// 获取cmdb的token
if !setCMDBToken() {
os.Exit(-1)
}
pub.Opt_UserActivitydetection_state = getOption(pub.Opt_UserActivitydetection)
pub.Opt_SendWX_state = getOption(pub.Opt_SendWX)
// 获取企业微信的token
setWXWorkToken()
pub.Opt_UserActivitydetection_state = reg.Query_DC(pub.Opt_UserActivitydetection)
pub.Opt_SendWX_state = reg.Query_DC(pub.Opt_SendWX)
go func() {
onehour := time.NewTicker(1 * time.Minute)
onehour := time.NewTicker(10 * time.Minute)
defer onehour.Stop()
for range onehour.C {
setCMDBToken()
......@@ -34,11 +38,17 @@ func messionloop() {
oneminute := time.NewTicker(1 * time.Minute)
defer oneminute.Stop()
for range oneminute.C {
pub.Opt_UserActivitydetection_state = getOption(pub.Opt_UserActivitydetection)
pub.Opt_SendWX_state = getOption(pub.Opt_SendWX)
pub.Opt_UserActivitydetection_state = reg.Query_DC(pub.Opt_UserActivitydetection)
pub.Opt_SendWX_state = reg.Query_DC(pub.Opt_SendWX)
}
}()
go func() {
sk := time.NewTicker(100 * time.Minute)
defer sk.Stop()
for range sk.C {
setWXWorkToken()
}
}()
}
func setCMDBToken() bool {
......@@ -68,6 +78,23 @@ func setCMDBToken() bool {
pub.Cmdb_token = string(r.Token)
return true
}
func getOption(opt string) string {
return reg.Query_DC(opt)
// https://developer.work.weixin.qq.com/document/path/91039
func setWXWorkToken() {
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", pub.WxworkCorid, pub.WxworkCorpSecret)
data, err := pub.SendGetRequest(&link)
if err != nil {
pub.LOG(ERROR, "automatic", err)
}
var wt pub.WxToken
if pub.ParseJson(data, &wt); err != nil {
pub.LOG(ERROR, "automatic", err)
}
if wt.Errcode == 0 {
reg.Write_DC(pub.Reg_Key_WxworkToken, wt.Access_token)
} else {
pub.LOG(ERROR, "automatic", wt.Errmsg)
}
pub.WxWorkToken = wt.Access_token
}
module AD-Control-Golang/daemon
go 1.18
go 1.17
require git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
......@@ -8,12 +8,15 @@ require git.zhiweidata.top/taotengfei/AD-Control-Golang/registry v0.0.0
require (
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/PuerkitoBio/goquery v1.8.0 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.2 // 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
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
golang.org/x/text v0.3.7 // indirect
)
......
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
......@@ -24,14 +28,23 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 h1:PgUUmg0gNMIPY2WafhL/oLyQGw+kdTNPlVWOjltpp3w=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
......@@ -187,29 +187,29 @@ func (cir *CIRecordStartup) GetDept() (string, error) {
}
switch hostnameSplit[1] {
case "JL":
result = Dept_zw_qbmb_jl_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_jl_string + Dept_zw_qbbm_unit
case "ZJ":
result = Dept_zw_qbmb_zj_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_zj_string + Dept_zw_qbbm_unit
case "MT":
result = Dept_zw_qbmb_mt_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_mt_string + Dept_zw_qbbm_unit
case "DD":
result = Dept_zw_qbmb_dd_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_dd_string + Dept_zw_qbbm_unit
case "JR":
result = Dept_zw_qbmb_jr_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_jr_string + Dept_zw_qbbm_unit
case "TXHD":
result = Dept_zw_qbmb_txhd_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_txhd_string + Dept_zw_qbbm_unit
case "TXWJ":
result = Dept_zw_qbmb_txwj_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_txwj_string + Dept_zw_qbbm_unit
case "JS":
result = Dept_zw_qbmb_js_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_js_string + Dept_zw_qbbm_unit
case "JD":
result = Dept_zw_qbmb_jd_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_jd_string + Dept_zw_qbbm_unit
case "HW":
result = Dept_zw_qbmb_hw_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_hw_string + Dept_zw_qbbm_unit
case "DY":
result = Dept_zw_qbmb_dy_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_dy_string + Dept_zw_qbbm_unit
case "BGYJ":
result = Dept_zw_qbmb_bgyj_string + Dept_zw_qbbm_unit
result = Dept_zw_qbbm_bgyj_string + Dept_zw_qbbm_unit
default:
result = ERROR
}
......
......@@ -15,21 +15,40 @@ const Dept_zw_peixun = "培训"
const Dept_zw_chaiwu = "财务"
const Dept_zw_jishu = "技术"
const Dept_zw_qbmb = "情报部门"
const Dept_zw_qbbm = "情报部门"
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_dy_string = "抖音"
const Dept_zw_qbmb_bgyj_string = "报告研究中心"
const Dept_zw_qbbm_jl_string = "巨量"
const Dept_zw_qbbm_zj_string = "字节"
const Dept_zw_qbbm_mt_string = "美团"
const Dept_zw_qbbm_dd_string = "滴滴"
const Dept_zw_qbbm_jr_string = "金融"
const Dept_zw_qbbm_txhd_string = "腾讯互动"
const Dept_zw_qbbm_txwj_string = "腾讯危机"
const Dept_zw_qbbm_js_string = "技术"
const Dept_zw_qbbm_jd_string = "京东"
const Dept_zw_qbbm_hw_string = "华为"
const Dept_zw_qbbm_dy_string = "抖音"
const Dept_zw_qbbm_bgyj_string = "报告研究中心"
const Dept_zw_qbbm_xmglwyh_string = "项目管理委员会"
const Dept_zw_zztd = "郑州团队"
const Dept_ldap_nb_12 = "宁波-12"
const Dept_ldap_nb_7 = "宁波-704"
const Dept_ldap_zz_1613 = "郑州-1613"
var Dept_zw_qbbm_map map[string]string = map[string]string{
"波塞冬Poseidon(华)": Dept_zw_qbbm_hw_string,
"盖娅Gaia(美)": Dept_zw_qbbm_mt_string,
"格劳克斯Glaucus(危)": Dept_zw_qbbm_txwj_string,
"哈迪斯Hades(互)": Dept_zw_qbbm_txhd_string,
"赫尔墨斯Hermes(京)": Dept_zw_qbbm_jd_string,
"克洛里斯Chloris(字)": Dept_zw_qbbm_zj_string,
"美杜莎Medusa(滴)": Dept_zw_qbbm_dd_string,
"普罗米修斯Prometheus": Dept_zw_qbbm_dy_string,
"雅典娜Athena(巨)": Dept_zw_qbbm_jl_string,
"赫斯提亚Hestia(研)": Dept_zw_qbbm_bgyj_string,
"宙斯Zeus": Dept_zw_jishu,
}
var Dept_zw_region_array = []string{Region_nb, Region_zz}
var Dept_zw_noqbmm_array = []string{Dept_zw_changpin, Dept_zw_renshi, Dept_zw_peixun, Dept_zw_chaiwu, Dept_zw_jishu}
......@@ -81,3 +100,23 @@ func GetPostationFromHostname(hostname string) (string, error) {
}
}
func GetQBBMdeptFromHostname(host, region string) (string, error) {
pop, err := GetPostationFromHostname(host)
if err != nil {
return "", err
}
var r string
switch region {
case Region_nb:
switch pop {
case Cmdb_Position_12:
r = Dept_ldap_nb_12
case Cmdb_Position_7:
r = Dept_ldap_nb_7
}
case Region_zz:
r = Dept_ldap_zz_1613
}
return r, err
}
......@@ -9,6 +9,8 @@ var Active bool = true
const SymbolHostname = "-"
const SymbolSplit = ","
const SymbolUrl = "_"
const SymbolDH = "、"
// AD-Control //
......@@ -72,6 +74,7 @@ const (
)
const Reg_Key_cmdbtoken string = "cmdb_token"
const Reg_Key_WxworkToken string = "WxworkToken"
const Reg_Value_ON string = "ON"
const Reg_Value_OFF string = "OFF"
......@@ -81,10 +84,6 @@ const Cmd_c string = "cmd /c "
const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start "
//
const Msg_file = "file"
const Msg_softlike = "softlike"
// wxwork key //
var WxworkBotLink string
......@@ -94,6 +93,7 @@ var WxworkReceiverId string
var WxworkCorid string
var WxworkCorpSecret string
var WxWorkAgentID string
var WxWorkToken string
const WxWorkInteraction_RemoteTerminal = "请求远程终端"
const WxWorkInteraction_SignUP = "申请个人账号"
......
module git.zhiweidata.top/taotengfei/AD-Control-Golang/public
go 1.18
go 1.17
require (
github.com/PuerkitoBio/goquery v1.8.0
github.com/go-ldap/ldap/v3 v3.4.2
github.com/gookit/color v1.5.0
github.com/mozillazg/go-pinyin v0.19.0
......@@ -11,8 +12,11 @@ require (
require (
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
)
replace git.zhiweidata.top/taotengfei/AD-Control-Golang/registry v0.0.0 => ..\registry
\ No newline at end of file
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
......@@ -24,14 +28,23 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 h1:PgUUmg0gNMIPY2WafhL/oLyQGw+kdTNPlVWOjltpp3w=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
......@@ -14,10 +14,11 @@ import (
// }
// 解析Json 并放到变量中
func ParseJson(unmsg []byte, v interface{}) {
func ParseJson(unmsg []byte, v interface{}) error {
if err := json.Unmarshal(unmsg, v); err != nil {
LOG(ERROR, "Parse Json Error", fmt.Sprintf("%v %v", err, v))
return fmt.Errorf("%v %v", err, v)
}
return nil
}
// Json 转 Byte
......
......@@ -31,7 +31,7 @@ func DealMsg(url []string, query string, unmsg []byte) ([]byte, error) {
var ret []byte
switch msgtype {
case Msg_file:
case Msg_File:
var err error
file := url[2]
ret, err = ioutil.ReadFile(Dir_application + file)
......@@ -40,7 +40,7 @@ func DealMsg(url []string, query string, unmsg []byte) ([]byte, error) {
LOG(ERROR, NULL, err)
return nil, err
}
case Msg_softlike:
case Msg_Softlike:
var err error
file := url[2]
ret, err = ioutil.ReadFile(Dir_softlike + file)
......@@ -48,6 +48,10 @@ func DealMsg(url []string, query string, unmsg []byte) ([]byte, error) {
LOG(ERROR, NULL, err)
return nil, err
}
case Msg_WXAuth:
return []byte(WXAuth(query)), nil
// 报告 消息
case Msg_Report:
var msg MJreport
......@@ -76,6 +80,7 @@ func DealMsg(url []string, query string, unmsg []byte) ([]byte, error) {
ice := msg.MsgDeal()
ret = ReParseJson(&ice)
// 将包含关于知微运维平台的人员、权限变化的任何消息
default:
msg := ParseWX(query, &unmsg)
go msg.MsgDealSend()
......@@ -106,6 +111,7 @@ func (rep *MJreport) MsgDeal() interface{} {
LOG(ERROR, rep.Instruction, err)
} else {
LOG(INFO, rep.Instruction, rep.Computername+" 关机")
SendWXWrokTextToChatAccountManager(rep.Computername + " 关机")
}
}
// 客户端
......@@ -127,6 +133,8 @@ func (rep *MJreport) MsgDeal() interface{} {
}
}
LOG(INFO, rep.Instruction, rep.Computername+" 开机")
SendWXWrokTextToChatAccountManager(rep.Computername + " 开机")
// 客户端
case Msg_status_deal:
return nil
......@@ -135,11 +143,12 @@ func (rep *MJreport) MsgDeal() interface{} {
case Msg_Report_WillLogInUser:
l := fmt.Sprintf("%s 在 %s 登陆", rep.DataStr, rep.Computername)
LOG(INFO, rep.Instruction, l)
SendWxworkTextToAdmins(l)
SendWXWrokTextToChatAccountManager(l)
case Msg_Report_WillLogOutUser:
l := fmt.Sprintf("%s 在 %s 注销", rep.DataStr, rep.Computername)
LOG(INFO, rep.Instruction, l)
SendWxworkTextToAdmins(l)
SendWXWrokTextToChatAccountManager(l)
// 更新主要计算机
case Msg_Report_UpdatePrimaryHost:
......@@ -166,7 +175,10 @@ func (rep *MJreport) MsgDeal() interface{} {
LOG(ERROR, rep.Instruction, err)
break
}
LOG(INFO, rep.Instruction, fmt.Sprintf("%s is %s's PrimryComputer", rep.Computername, rep.Username))
l := fmt.Sprintf("%s is %s's PrimryComputer", rep.Computername, rep.Username)
LOG(INFO, rep.Instruction, l)
SendWXWrokTextToChatAccountManager(l)
rep.DataStr = Sccessful_CMDB_UPDATE_REQ
// 客户端
......@@ -179,21 +191,25 @@ func (rep *MJreport) MsgDeal() interface{} {
// 注册账号
case Msg_Report_SignUPUser:
switch rep.Status {
case Msg_status_commit:
// 先打印日志
LOG(INFO, rep.Instruction, rep.DataStr)
//SendWxworkTextToHR(rep.DataStr)
SendWxworkTextToAdmins(rep.DataStr)
case Msg_status_deal:
msg := strings.Split(rep.DataStr, "\n")
//region := strings.Split(msg[1], "\n")[1]
// 第0行是消息标题
region := strings.Split(msg[1], ":")[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)
ldap_dept, err := GetQBBMdeptFromHostname(host, region)
if err != nil {
LOG(ERROR, rep.Instruction, err)
break
}
searchbase := fmt.Sprintf("-SearchBase 'OU=%s,OU=情报部门,DC=zhiweireach,DC=com'", ldap_dept)
// 判断 用户是否在离职目录中
dismission, err := LDAP_ExistAccount_dimission(name)
......@@ -235,44 +251,59 @@ func (rep *MJreport) MsgDeal() interface{} {
}
// 创建用户
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))
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'" %s).DistinguishedName) -UserPrincipalName %s@zhiweireach.com`, name, name, pinyin, Defult_user_key, dept, searchbase, 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 + "创建完成")
reply := `您的账号创建好了!
账号名:姓名拼音小写
初始密码:1Q2W3e4r
登录后需要重置密码,密码规则大小写+数字+至少8位,不能包含用户名
个人账号支持通过“知微运维平台”唤醒主机
该账号在登录时,从左下角的“切换用户”按钮进行登录。
使用时,需要从旧账号手动迁移到个人文件到新账号。`
// 发送给创建对象
SendWxworkTextToAUser(name, reply)
// 命令行记录
LOG(INFO, rep.Instruction, name+"创建完成")
SendWxworkTextToAUser(name, name+"创建完成")
// 发送给HR和admin
SendWxworkTextToHR(name + "创建完成")
}
// 停用账号
case Msg_Report_Dimission:
switch rep.Status {
case Msg_status_commit:
// 先打印日志
LOG(INFO, rep.Instruction, rep.DataStr)
// 第0行是消息标题
msg := strings.Split(rep.DataStr, "\n")
//region := strings.Split(msg[1], "\n")[1]
region := strings.Split(msg[1], ":")[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 {
// 停用账号
if out, err := PSCommandOutput(fmt.Sprintf(`Get-ADUser -Filter 'Name -eq "%s"' -SearchBase ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" | Where-Object -filter {$_.DistinguishedName -like "*%s*"}).DistinguishedName) | disable-ADAccount`, name, dept, region)); 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 {
// 移动到离职目录中
if out, err := PSCommandOutput(fmt.Sprintf(`Get-ADUser -Filter 'Name -eq "%s"' -SearchBase ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" | Where-Object -filter {$_.DistinguishedName -like "*%s*"}).DistinguishedName ) | Move-ADObject -TargetPath ((Get-ADOrganizationalUnit -Filter "Name -eq '%s'" ).DistinguishedName)`, name, dept, region, 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("个人账号创建完成\n" +
"账号名:姓名拼音小写\n" +
"初始密码:1Q2W3e4r\n" +
"首次登录后需要重置密码,密码规则大小写+数字+至少8位,不包含用户名\n" +
"个人账号支持通过“知微运维平台”远程唤醒主机!")
LOG(INFO, rep.Instruction, dept+name+" 个人账号注销完成")
rep.SendWXwork("个人账号注销完成")
}
// 获取软件文件名
case Msg_Report_GetSoftlike:
switch rep.Status {
case Msg_status_commit:
......@@ -286,6 +317,19 @@ func (rep *MJreport) MsgDeal() interface{} {
MS.S = rep.DataStr
}
// 获取URL
case Msg_Report_GetURL:
switch rep.Status {
case Msg_status_commit:
switch rep.DataStr {
case URL_WXWork_QRCode_Login:
rep.Explain = fmt.Sprintf("https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=%s&agentid=%s&redirect_uri=%s&state=%s", WxworkCorid, WxWorkAgentID, URL_Wxwork_QrCode_Redirect, fmt.Sprintf("%s%s%s", rep.PlusStr, SymbolUrl, rep.Computername))
LOG(INFO, rep.Instruction, rep.Computername+"获取企业微信登录二维码")
}
case Msg_status_deal:
MS.S = rep.Explain
}
default:
LOG(ERROR, "Default Report Json", rep.Instruction)
}
......@@ -773,3 +817,74 @@ func (wxwork *MJwxwork) MsgDealSend() {
}
wxwork.SendResult()
}
// /wxauth的企业微信登录后 的 消息处理
func WXAuth(query string) string {
s := strings.Split(query, "&")
q := make(map[string]string, len(s))
for _, j := range s {
t := strings.Split(j, "=")
q[t[0]] = t[1]
}
state := strings.Split(q["state"], SymbolUrl)
msg_type := state[0]
appid := q["appid"]
if appid != WxworkCorid {
LOG(ERROR, "wxauth", "不是预设的appid")
return "不是预设的信息"
}
switch msg_type {
case Msg_Report_SignUPUser:
logtype := "wx_auth_signup_user"
code := q["code"]
if code == "" {
LOG(ERROR, "wxauth", "用户禁止授权")
return "用户禁止授权"
}
hostname := state[1]
// 根据二维码登录后获得的code获取userid
userid, err := GetWXworktUserID(code)
if err != nil {
LOG(ERROR, "wxauth", "获取企业微信token失败")
return "获取企业微信token失败"
}
// 根据userid获取同事的信息
wi, err := GetWxworkWorkerInfo(userid)
if err != nil {
LOG(ERROR, "wxauth", "获取信息失败")
return "获取信息失败"
}
deptlist := make([]string, len(wi.Department))
var dept_output string
for i, j := range wi.Department {
// 根据部门ID,获取部门古希腊名
dept, err := GetWxworkWorkerDepartmentName(j)
if err != nil {
LOG(ERROR, "wxauth", "获取部门信息失败")
return "获取部门信息失败"
}
// 古希腊转现代
if Dept_zw_qbbm_map[dept] != "" {
dept = Dept_zw_qbbm_map[dept]
}
dept_output = dept
deptlist[i] = dept
}
LOG(INFO, logtype, fmt.Sprintf("%s 所属 %s", wi.Name, strings.Join(deptlist, SymbolDH)))
region := Region_nb
for _, j := range deptlist {
if j == Dept_zw_zztd {
region = Region_zz
}
}
l := fmt.Sprintf("%s\n地区:%s\n部门:%s\n姓名:%s\n主机名:%s", WxWorkInteraction_SignUP, region, dept_output, wi.Name, hostname)
LOG(INFO, logtype, l)
SendADMsg(Msg_Report, GJreportPlusString(Msg_Report_SignUPUser, l, wi.Userid))
}
return "请在企业微信中获取处理结果!"
}
......@@ -15,6 +15,9 @@ const Msg_status_deal string = "deal"
// msg type ////////////////////////////////////////////////////////////////
const Msg_File string = "file"
const Msg_Softlike string = "softlike"
const Msg_WXAuth string = "wxauth"
const Msg_Report string = "report"
const Msg_Exec string = "exec"
const Msg_Wake string = "wake"
......@@ -35,6 +38,7 @@ const Msg_Report_UpdatePrimaryHost string = "UpdatePrimaryHost"
const Msg_Report_SignUPUser string = "SignUPUser"
const Msg_Report_Dimission string = "Dimission"
const Msg_Report_GetSoftlike string = "GetSoftlike"
const Msg_Report_GetURL string = "GetURL"
// msg exec type ////////////////////////////////////////////////////////////////
......@@ -71,6 +75,12 @@ const WXEK_zwDevopsHostGetinfo string = "zwdevops_host_getinfo"
const WXEK_zwDevopsAccountSelf string = "zwdevops_account_self"
const WXEK_zwDevopsAccountPublic string = "zwdevops_account_public"
const WXWORK_zwDevopsChatAccountManager string = "zwDevopsChatAccountManager"
// URL
const URL_Wxwork_QrCode_Redirect string = "http://zhiweiadserver.xunyang.site:16823/wxauth"
const URL_WXWork_QRCode_Login string = "URL_WXWork_QRCode_Login"
// Registry Root
const (
Msg_Reg_Query = iota
......@@ -99,6 +109,7 @@ type MJbase struct {
Timestamp int64 `json:"timestamp"`
DataBool bool `json:"databool"`
DataStr string `json:"datastr"`
PlusStr string `json:"plusstr"`
Instruction string `json:"instruction"`
Version string `json:"version"`
}
......@@ -159,6 +170,14 @@ func GJreportString(s string, d string) interface{} {
rep.DataStr = d
return rep
}
func GJreportPlusString(s string, d string, p string) interface{} {
var rep MJreport
rep.Init(s)
rep.DataStr = d
rep.PlusStr = p
return rep
}
func GJreportUsernameString(s string, n string, d string) interface{} {
var rep MJreport
rep.Init(s)
......
......@@ -24,7 +24,7 @@ func Telnet(ip, port string) bool {
var initServer = false
func DownloadFile(url, saveFile string) error {
func DownloadFileInside(url, saveFile string) error {
if !initServer {
if Telnet(Host_adserver_wan, DaemonListen[1:]) {
Host_server_download = Host_adserver_wan + DaemonListen
......@@ -46,7 +46,21 @@ func DownloadFile(url, saveFile string) error {
if err := PSCommandWait(cmd); err != nil {
return err
}
default:
return fmt.Errorf("不支持该操作系统的下载方式")
}
return nil
}
func DownlaodFileOutSide(url, saveFile string) error {
switch OS_Type {
case OS_Type_Windows:
cmd := fmt.Sprintf(`Invoke-WebRequest -uri "%s" -OutFile "%s"`, url, saveFile)
if err := PSCommandWait(cmd); err != nil {
return err
}
default:
return fmt.Errorf("不支持该操作系统的下载方式")
}
return nil
}
......@@ -106,8 +106,7 @@ func SendGetRequest(link *string) ([]byte, error) {
if resp.StatusCode != 200 {
return nil, fmt.Errorf("url:%s,StatusCode:%d", *link, resp.StatusCode)
}
body, err := ioutil.ReadAll(resp.Body)
return body, err
return ioutil.ReadAll(resp.Body)
}
// 发送 带Data的Post请求
......@@ -144,24 +143,19 @@ func SendWX(Content string) {
}
}`)
http.Post(WxworkBotLink, "application/json; charset=utf-8", bytes.NewBuffer(w))
}
// 发送应用消息(
// https://developer.work.weixin.qq.com/document/path/90236
func SendWxworkTextToAUser(nameOrID, text string) error {
// 获取 最新 token
t, err := GetWXWorkToken()
if err != nil {
return err
}
// 初始化 消息推送 结构体
var wsmt WxSendMsgText
wsmt.Init()
wsmt.Touser = nameOrID
wsmt.Text.Content = text
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s&debug=1", t)
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s&debug=1", WxWorkToken)
// 发送 Post 请求
res, err := SendPostRequestWithData(&link, &wsmt)
......@@ -180,12 +174,40 @@ func SendWxworkTextToAUser(nameOrID, text string) error {
}
return nil
}
func SendWXWrokTextToChat(chatid string, Content string) error {
if DomainCotroller() {
if Opt_SendWX_state == "0" {
LOG(WARN, "opt_deny", "取消微信发送")
return fmt.Errorf("取消微信发送")
}
}
// Content不支持发送Json,
w := []byte(`
{
"chatid": ` + chatid + `",
"msgtype":"text",
"text":{
"content" : "` + Content + `"
},
"safe":0
}`)
_, err := http.Post(fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s", WxWorkToken), "application/json; charset=utf-8", bytes.NewBuffer(w))
if err != nil {
LOG(ERROR, "send_chat_account_manager", err)
return err
}
return nil
}
func SendWxworkTextToAdmins(nameOrID string) error {
return SendWxworkTextToAUser("TaoTengFei", nameOrID)
return SendWxworkTextToAUser("TaoTengFei|BaoJiaQi", nameOrID)
}
func SendWxworkTextToHR(nameOrID string) error {
return SendWxworkTextToAUser("BianShuang", nameOrID)
return SendWxworkTextToAUser("TaoTengFei|BaoJiaQi|BianShuang", nameOrID)
}
func SendWXWrokTextToChatAccountManager(Conentstring string) error {
return SendWXWrokTextToChat(WXWORK_zwDevopsChatAccountManager, Conentstring)
}
// 根据主机位置定义发送的服务器
......
......@@ -52,6 +52,7 @@ func execcmd_base(cmdargs string) (string, []string, error) {
app = cmdargs
appargs[0] = ""
}
fmt.Println(cmdargs)
LOG(INFO, "CMD", cmdargs)
return app, appargs, nil
}
......@@ -118,6 +119,12 @@ func Execcmd_waitOutput(cmdargs string) ([]byte, error) {
}
return cmd.CombinedOutput()
}
func Execcmd_two_nowait(cmd, cmdargs string) error {
if err := exec.Command(cmd, cmdargs).Start(); err != nil {
return err
}
return nil
}
// 包含标准错误的结果输出
func Execcmd_output(cmdargs string) []byte {
......@@ -239,7 +246,7 @@ func PSTest_Connection(host string) (bool, error) {
// local
func OpenWindow(s string) {
Execcmd_nowait("explorer " + s)
Execcmd_nowait(fmt.Sprintf(`msedge "%s"`, s))
}
//
......
......@@ -28,7 +28,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// fmt.Fprintf(w,string(res))
// return
// 解密html
// 解密query
msg, cerr := wxcpt.DecryptMsg(
m["msg_signature"][0],
m["timestamp"][0],
......@@ -47,16 +47,8 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
return w
}
// 获取 查阅同事的token
wtBricklayer, err := GetWXWorkToken()
if err != nil {
LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Fail_ReTry
return w
}
// 查询 姓名
name, err := GetBricklayerName(wtBricklayer, wxmsg.FromUsername)
wi, err := GetWxworkWorkerInfo(wxmsg.FromUsername)
if err != nil {
LOG(ERROR, NULL, err)
w.Result = Error_WXWork_Fail_ReTry
......@@ -68,7 +60,7 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// wxmsg.EventKey是菜单事件
w.Instruction = wxmsg.EventKey
w.UserID = wxmsg.FromUsername
w.Name = name
w.Name = wi.Name
w.Content = wxmsg.Content
// 先回复空,再异步发送处理结果
......@@ -102,35 +94,64 @@ func ParseWX(d string, byteBody *[]byte) MJwxwork {
// return string(cryptMsg)
}
// 读取企业通讯录的成员信息(需要管理员登录)
// https://work.weixin.qq.com/api/doc/90000/90135/90196
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)
// https://developer.work.weixin.qq.com/document/path/91437
func GetWXworktUserID(code string) (string, error) {
type wxUserID struct {
Errcode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
UserID string `json:"userid"`
}
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=%s&code=%s", WxWorkToken, code)
data, err := SendGetRequest(&link)
if err != nil {
LOG(ERROR, NULL, err)
return "", Error_WXWork_Down
return "", err
}
var wxuid wxUserID
if err := ParseJson(data, &wxuid); err != nil {
return "", err
}
var bi wxJsonBricklayerInfo
ParseJson(data, &bi)
if bi.Errcode != 0 {
LOG(ERROR, NULL, bi.Errmsg)
return "", Error_WXWork_Down
if wxuid.Errcode != 0 {
return "", fmt.Errorf(wxuid.ErrMsg)
}
return bi.Name, nil
return wxuid.UserID, nil
}
// 读取企业通讯录的成员信息
// https://developer.work.weixin.qq.com/document/path/90196
func GetWxworkWorkerInfo(userid string) (wxJsonWorkerInfo, error) {
var wi wxJsonWorkerInfo
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s", WxWorkToken, userid)
data, err := SendGetRequest(&link)
if err != nil {
return wxJsonWorkerInfo{}, err
}
if err := ParseJson(data, &wi); err != nil {
return wxJsonWorkerInfo{}, err
}
if wi.Errcode != 0 {
return wxJsonWorkerInfo{}, fmt.Errorf(wi.Errmsg)
}
return wi, nil
}
func GetWXWorkToken() (string, error) {
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", WxworkCorid, WxworkCorpSecret)
// 根据部门ID获取部门名称
// https://developer.work.weixin.qq.com/document/path/95351
func GetWxworkWorkerDepartmentName(deptID int) (string, error) {
var wd wxJsonWorkerDepartment
link := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/department/get?access_token=%s&id=%d", WxWorkToken, deptID)
data, err := SendGetRequest(&link)
if err != nil {
return "", err
}
var wt WxToken
ParseJson(data, &wt)
if wt.Errcode == 0 {
return wt.Access_token, nil
} else {
return "", Error_Fail_File_Write
if err := ParseJson(data, &wd); err != nil {
return "", err
}
if wd.Errcode != 0 {
return "", fmt.Errorf(wd.Errmsg)
}
return wd.Department.Name, nil
}
package public
// JSON:token返回格式
// https://open.work.weixin.qq.com/api/doc/90000/90135/91039
type WxToken struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Access_token string `json:"access_token"`
Expires_in int `json:"expires_in"`
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Access_token string `json:"access_token"`
Expires_in int `json:"expires_in"`
}
type WxSendMsgRec struct {
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
Invaliduser string `json:"invaliduser"`
Invalidparty string `json:"invalidparty"`
Invalidtag string `json:"invalidtag"`
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
Invaliduser string `json:"invaliduser"`
Invalidparty string `json:"invalidparty"`
Invalidtag string `json:"invalidtag"`
}
// JSON:消息发送格式
// https://work.weixin.qq.com/api/doc/90000/90135/90236#%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF
type WxSendMsgText struct {
Touser string `json:"touser"`
Toparty string `json:"toparty"`
Totag string `json:"totag"`
Msgtype string `json:"msgtype"`
Agentid int `json:"agentid"`
Text WxSendMsgTextContent `json:"text"`
Safe int `json:"safe"`
Enable_id_trans int `json:"enable_id_trans"`
Enable_duplicate_check int `json:"enable_duplicate_check"`
Duplicate_check_interval int `json:"duplicate_check_interval"`
Touser string `json:"touser"`
Toparty string `json:"toparty"`
Totag string `json:"totag"`
Msgtype string `json:"msgtype"`
Agentid int `json:"agentid"`
Text WxSendMsgTextContent `json:"text"`
Safe int `json:"safe"`
Enable_id_trans int `json:"enable_id_trans"`
Enable_duplicate_check int `json:"enable_duplicate_check"`
Duplicate_check_interval int `json:"duplicate_check_interval"`
}
type WxSendMsgTextContent struct {
Content string `json:"content"`
Content string `json:"content"`
}
func(wsmt * WxSendMsgText) Init(){
wsmt.Msgtype = "text"
wsmt.Agentid = 1000014
wsmt.Safe = 0
wsmt.Enable_id_trans = 0
wsmt.Enable_duplicate_check = 0
wsmt.Duplicate_check_interval = 1800
func (wsmt *WxSendMsgText) Init() {
wsmt.Msgtype = "text"
wsmt.Agentid = 1000014
wsmt.Safe = 0
wsmt.Enable_id_trans = 0
wsmt.Enable_duplicate_check = 0
wsmt.Duplicate_check_interval = 1800
}
// 获取 同事个人信息的Json
// https://open.work.weixin.qq.com/api/doc/90000/90135/90196
type wxJsonBricklayerInfo struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Userid string `json:"userid"`
Name string `json:"name"`
Department []int `json:"department"`
Order []int `json:"order"`
Position string `json:"position"`
Mobile string `json:"mobile"`
Gender string `json:"gender"`
Email string `json:"email"`
Is_leader_in_dept []int `json:"is_leader_in_dept"`
Avatar string `json:"avatar"`
Thumb_avatar string `json:"thumb_avatar"`
Telephone string `json:"telephone"`
Alias string `json:"alias"`
Address string `json:"address"`
Open_userid string `json:"open_userid"`
Main_department int `json:"main_department"`
Extattr wxJsonBricklayerInfoExtattr `json:"extattr"`
Status int `json:"status"`
Qr_code string `json:"qr_code"`
External_position string `json:"external_position"`
External_profile wxJsonBricklayerInfoExtattr `json:"external_profile"`
type wxJsonWorkerInfo struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Userid string `json:"userid"`
Name string `json:"name"`
Department []int `json:"department"`
Order []int `json:"order"`
Position string `json:"position"`
Mobile string `json:"mobile"`
Gender string `json:"gender"`
Email string `json:"email"`
Is_leader_in_dept []int `json:"is_leader_in_dept"`
Avatar string `json:"avatar"`
Thumb_avatar string `json:"thumb_avatar"`
Telephone string `json:"telephone"`
Alias string `json:"alias"`
Address string `json:"address"`
Open_userid string `json:"open_userid"`
Main_department int `json:"main_department"`
Extattr wxJsonWorkerInfoExtattr `json:"extattr"`
Status int `json:"status"`
Qr_code string `json:"qr_code"`
External_position string `json:"external_position"`
External_profile wxJsonWorkerInfoExtattr `json:"external_profile"`
}
type wxJsonBricklayerInfoExtattr struct {
Attrs [] wxJsonBricklayerInfoExtattrValue `json:"attrs"`
type wxJsonWorkerInfoExtattr struct {
Attrs []wxJsonWorkerInfoExtattrValue `json:"attrs"`
}
type wxJsonBricklayerInfoExtattrValue struct {
Type int `json:"type"`
Name string `json:"name"`
Text wxJsonBricklayerInfoExtattrValueText `json:"text"`
Web wxJsonBricklayerInfoExtattrValueWeb `json:"value"`
MiniProgram wxJsonBricklayerInfoExtattrValueMinProgram `json:"miniProgram"`
type wxJsonWorkerInfoExtattrValue struct {
Type int `json:"type"`
Name string `json:"name"`
Text wxJsonWorkerInfoExtattrValueText `json:"text"`
Web wxJsonWorkerInfoExtattrValueWeb `json:"value"`
MiniProgram wxJsonWorkerInfoExtattrValueMinProgram `json:"miniProgram"`
}
type wxJsonBricklayerInfoExtattrValueText struct {
Value string `json:"value"`
type wxJsonWorkerInfoExtattrValueText struct {
Value string `json:"value"`
}
type wxJsonBricklayerInfoExtattrValueWeb struct {
Url string `json:"url"`
Title string `json:"title"`
type wxJsonWorkerInfoExtattrValueWeb struct {
Url string `json:"url"`
Title string `json:"title"`
}
type wxJsonBricklayerInfoExtattrValueMinProgram struct {
Appid string `json:"appid"`
Pagepath string `json:"pagepath"`
Title string `json:"title"`
type wxJsonWorkerInfoExtattrValueMinProgram struct {
Appid string `json:"appid"`
Pagepath string `json:"pagepath"`
Title string `json:"title"`
}
type wxXml struct {
ToUsername string `xml:"ToUserName"`
FromUsername string `xml:"FromUserName"`
CreateTime uint32 `xml:"CreateTime"`
MsgType string `xml:"MsgType"`
Content string `xml:"Content"`
Msgid string `xml:"MsgId"`
Agentid uint32 `xml:"AgentId"`
Event string `xml:"Event"`
EventKey string `xml:"EventKey"`
ToUsername string `xml:"ToUserName"`
FromUsername string `xml:"FromUserName"`
CreateTime uint32 `xml:"CreateTime"`
MsgType string `xml:"MsgType"`
Content string `xml:"Content"`
Msgid string `xml:"MsgId"`
Agentid uint32 `xml:"AgentId"`
Event string `xml:"Event"`
EventKey string `xml:"EventKey"`
}
type wxJsonWorkerDepartment struct {
Errcode int `json:"errcode"`
Errmsg string `json:"errmsg"`
Department wxJsonWorkerDepartmentExtattrDept `json:"department"`
}
type wxJsonWorkerDepartmentExtattrDept struct {
Id int `json:"id"`
Name string `json:"name"`
Name_en string `json:"name_en"`
Department_leader []string `json:"department_leader"`
Parentid int `json:"parentid"`
Order int `json:"order"`
}
......@@ -12,6 +12,7 @@ const (
HKCU = iota
HKLM
HKU
HKCR
)
var Error_Null_Reg_Query = errors.New("not found reg query result")
......@@ -115,6 +116,8 @@ func prase(root *int) registry.Key {
return registry.USERS
case HKLM:
return registry.LOCAL_MACHINE
case HKCR:
return registry.CLASSES_ROOT
}
return registry.LOCAL_MACHINE
}
module AD-Control-Golang/users
go 1.18
go 1.17
require git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
......@@ -13,6 +13,8 @@ require (
require (
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e // indirect
github.com/PuerkitoBio/goquery v1.8.0 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.2 // indirect
github.com/gookit/color v1.5.0 // indirect
......@@ -20,6 +22,7 @@ require (
github.com/mozillazg/go-pinyin v0.19.0 // indirect
github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 // indirect
golang.org/x/text v0.3.7 // indirect
gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect
......
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e h1:ZU22z/2YRFLyf/P4ZwUYSdNCWsMEI0VeyrFoI2rAhJQ=
github.com/Azure/go-ntlmssp v0.0.0-20211209120228-48547f28849e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
......@@ -28,15 +32,24 @@ golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o=
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0 h1:PgUUmg0gNMIPY2WafhL/oLyQGw+kdTNPlVWOjltpp3w=
golang.org/x/sys v0.0.0-20220403020550-483a9cbc67c0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc=
gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
......
......@@ -19,7 +19,7 @@ const timeout int = 30
func menuInitName(ni *walk.NotifyIcon) {
text := fmt.Sprintf("姓名: %s", pub.User_name_display)
text := fmt.Sprintf("系统账号: %s", pub.User_name_display)
na := walk.NewAction()
if err := na.SetText(text); err != nil {
pub.LOG(pub.ERROR, NULL, err)
......@@ -125,99 +125,23 @@ func menuInitAccountManager(ni *walk.NotifyIcon) {
sysmenu.SetEnabled(true)
}
type signUpStruct struct {
Name *walk.LineEdit
Dept *walk.ComboBox
}
// 账号管理 申请个人账号
func tAccountManagerSignUP() {
if !pub.PublicUser() {
Msg("您已经正在使用个人账号!")
return
}
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 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 {
exec = pub.IfBeforeMin(pub.UnixTimeParseTimeFromString(reg_t), timeout)
}
if !exec {
Msg(`暂时无法使用,稍后重试!`)
// 仅仅公共用户可使用“申请个人账号”功能
// if !pub.PublicUser() {
// go Msg("您已经正在使用个人账号!")
// return
// }
// 获取登录地址
pub.SendADMsg(pub.Msg_Report, pub.GJreportPlusString(pub.Msg_Report_GetURL, pub.URL_WXWork_QRCode_Login, pub.Msg_Report_SignUPUser))
default_explorer := reg.Query_key_one(reg.HKCR, `http\shell\open\command`, ``)
default_explorer = default_explorer[1 : len(default_explorer)-4]
if err := pub.Execcmd_two_nowait(default_explorer, pub.MS.S); err != nil {
pub.LOG(ERROR, NULL, err)
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())
}
}
// 主机管理
......@@ -451,9 +375,9 @@ func (mw *siMainWindow) siInstall() {
app := (&mw.siM.items[mw.siLB.CurrentIndex()]).name
go Msg("下载文件中,请等待,请勿重复点击")
pub.LOG(INFO, "SoftwareInstall", "下载"+app)
url := fmt.Sprintf("%s/%s", pub.Msg_softlike, app)
url := fmt.Sprintf("%s/%s", pub.Msg_Softlike, app)
fullapp := fmt.Sprintf(`%s\%s`, pub.Dir_tmp, app)
err := pub.DownloadFile(url, fullapp)
err := pub.DownloadFileInside(url, fullapp)
if err != nil {
go Msg("下载文件失败")
pub.LOG(ERROR, "SoftwareInstall", "下载文件失败"+err.Error())
......
......@@ -107,12 +107,14 @@ func userEnvInit() {
}
func main() {
if !pub.Windows() {
os.Exit(-1)
}
if pub.DomainCotroller() {
os.Exit(-1)
}
// if pub.DomainCotroller() {
// os.Exit(-1)
// }
// 用户 初始化
icodir := userInit()
userEnvInit()
......
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