Commit 12f94acc by 陶腾飞

2022/07/21 v2.6.1

parent 5f2218f8
......@@ -106,7 +106,8 @@
- 2022/06/14 v2.5.7 更新日志输出、删除情报一二三部
- 2022/07/06 v2.5.8 增加抖音组,解决walk的反射问题,优化软件安装的下载速度
- 2022/07/07 v2.5.9 隐藏下载软件的窗口
- 2022/07/22 v2.6.0 使用企业微信作为注册个人账号的验证方式
- 2022/07/12 v2.6.0 使用企业微信作为注册个人账号的验证方式
- 2022/07/21 v2.6.1 自动初始化
## 四、其他说明
......
......@@ -10,6 +10,9 @@ import (
"strings"
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/declarative"
)
......@@ -19,6 +22,8 @@ const NULL = pub.NULL
var sendserver func(msgtype string, v interface{})
const reg_init string = "init"
var LOG = pub.LOG
var f struct {
Force bool
......@@ -38,6 +43,7 @@ func main() {
var loglevel = flag.String("loglevel", INFO, "")
var force = flag.Bool("force", false, "force exec,ignore other")
var quick = flag.Bool("quick", false, "quickly exec")
var init = flag.String("init", "", "init args")
flag.Parse()
......@@ -70,6 +76,9 @@ func main() {
pub.DomainCotroller()
wolPart(*wolPartText)
} else {
if reg.Query_ADPCLM(reg_init) == "" {
reg.Write_ADPCLM(reg_init, *init)
}
gui()
}
......@@ -130,7 +139,13 @@ func flag_report(s string) {
d = []byte(pub.User_name_display)
case pub.Msg_Report_WillLogOutUser:
d = []byte(pub.User_name_display)
case pub.Msg_Report_MoveLDAPInstall:
if !pub.Zhiweireach() {
return
}
if _, err := pub.GetHostnamePart(pub.User_computername); err != nil {
return
}
}
pub.SendADMsg(pub.Msg_Report, pub.GJreportString(s, string(d)))
}
......@@ -164,10 +179,11 @@ 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},
Title: "域控制工具",
MinSize: Size{Width: 350, Height: 200},
Size: Size{Width: 350, Height: 200},
Layout: VBox{MarginsZero: true}, // 请勿删除
Children: []Widget{
PushButton{
......@@ -180,5 +196,37 @@ func gui() {
}
}
func guiInitDC() {
checkNet()
joinDomain()
}
//
func checkNet() {
IP := pub.GetIPFromNslookup()
DNS := pub.GetPrimaryDNSFromIP(IP)
if !(DNS == pub.Host_adserver_lan || DNS == pub.Host_thserver_lan || DNS == pub.Host_zzserver_lan) {
go Msg(fmt.Sprintf("IP和DNS不是预定值!\n当前IP:%s,DNS:%s", IP, DNS))
return
}
}
func joinDomain() {
if pub.Zhiweireach() {
return
}
hostname := reg.Query_ADPCLM(reg_init)
if hostname == "" {
go Msg("空值hostname")
return
}
ps := fmt.Sprintf(`Add-Computer -DomainName "zhiweireach.com" -Credential (Get-Credential -Message '输入域管理员账号') -newname %s -restart`, hostname)
err := pub.PSCommandPromptWait(ps)
if err != nil {
go Msg(err.Error())
return
}
}
// 显示带确定的消息框
func Msg(message string) {
walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxIconInformation)
}
......@@ -4,8 +4,11 @@ go 1.17
replace git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0 => ..\public
replace git.zhiweidata.top/taotengfei/AD-Control-Golang/registry v0.0.0 => ..\registry
require (
git.zhiweidata.top/taotengfei/AD-Control-Golang/public v0.0.0
git.zhiweidata.top/taotengfei/AD-Control-Golang/registry v0.0.0
github.com/lxn/walk v0.0.0-20210112085537-c389da54e794
)
......
......@@ -420,8 +420,7 @@ func CmdbPOST(url string, reqdata []byte) ([]byte, error) {
defer res.Body.Close()
data, errdata := ioutil.ReadAll(res.Body)
if res.StatusCode != 200 {
LOG(ERROR, "CMDB_POST", fmt.Sprintf("状态码:%d,路径:%s,返回数据:%s,参数:%s", res.StatusCode, url, string(data), string(reqdata)))
return nil, err
return nil, fmt.Errorf("状态码:%d,路径:%s,返回数据:%s,参数:%s", res.StatusCode, url, string(data), string(reqdata))
}
if errdata != nil && errdata == io.EOF {
return data, nil
......
......@@ -180,39 +180,11 @@ func GetCMDBPosition(location, dept string) string {
}
func (cir *CIRecordStartup) GetDept() (string, error) {
hostnameSplit, err := GetHostnamePart(User_computername)
var result string
if err != nil {
LOG(ERROR, "", err)
return "", err
}
switch hostnameSplit[1] {
case "JL":
result = Dept_zw_qbbm_jl_string + Dept_zw_qbbm_unit
case "ZJ":
result = Dept_zw_qbbm_zj_string + Dept_zw_qbbm_unit
case "MT":
result = Dept_zw_qbbm_mt_string + Dept_zw_qbbm_unit
case "DD":
result = Dept_zw_qbbm_dd_string + Dept_zw_qbbm_unit
case "JR":
result = Dept_zw_qbbm_jr_string + Dept_zw_qbbm_unit
case "TXHD":
result = Dept_zw_qbbm_txhd_string + Dept_zw_qbbm_unit
case "TXWJ":
result = Dept_zw_qbbm_txwj_string + Dept_zw_qbbm_unit
case "JS":
result = Dept_zw_qbbm_js_string + Dept_zw_qbbm_unit
case "JD":
result = Dept_zw_qbbm_jd_string + Dept_zw_qbbm_unit
case "HW":
result = Dept_zw_qbbm_hw_string + Dept_zw_qbbm_unit
case "DY":
result = Dept_zw_qbbm_dy_string + Dept_zw_qbbm_unit
case "BGYJ":
result = Dept_zw_qbbm_bgyj_string + Dept_zw_qbbm_unit
default:
result = ERROR
}
result := GetLDAPDeptFromHostnameP2(hostnameSplit[1], true)
return result, nil
}
func (cir *CIRecordResult) String() ([]byte, error) {
......
......@@ -36,6 +36,12 @@ const Dept_ldap_nb_12 = "宁波-12"
const Dept_ldap_nb_7 = "宁波-704"
const Dept_ldap_zz_1613 = "郑州-1613"
var Dept_qbbm_cmdb_ldap map[string]string = map[string]string{
Cmdb_Position_12: Dept_ldap_nb_12,
Cmdb_Position_7: Dept_ldap_nb_7,
Cmdb_Position_zhengzhou: Dept_ldap_zz_1613,
}
var Dept_zw_qbbm_map map[string]string = map[string]string{
"波塞冬Poseidon(华)": Dept_zw_qbbm_hw_string,
"盖娅Gaia(美)": Dept_zw_qbbm_mt_string,
......@@ -91,12 +97,12 @@ func GetPostationFromHostname(hostname string) (string, error) {
case HOST_Dept_DY:
return Cmdb_Position_7, nil
default:
return "", fmt.Errorf("%s is error format", hostname)
return "", fmt.Errorf("%s 不是预定的情报部门的格式", hostname)
}
case HOST_Region_ZZ:
return Cmdb_Position_zhengzhou, nil
default:
return "", fmt.Errorf("%s is error format", hostname)
return "", fmt.Errorf("%s 不是预定的情报部门的格式", hostname)
}
}
......@@ -120,3 +126,39 @@ func GetQBBMdeptFromHostname(host, region string) (string, error) {
}
return r, err
}
// 根据主机名的第二部分获取LDAP的名称
func GetLDAPDeptFromHostnameP2(part string, groupname bool) string {
var unit string
if groupname {
unit = Dept_zw_qbbm_unit
}
var result string
switch part {
case "JL":
result = Dept_zw_qbbm_jl_string + unit
case "ZJ":
result = Dept_zw_qbbm_zj_string + unit
case "MT":
result = Dept_zw_qbbm_mt_string + unit
case "DD":
result = Dept_zw_qbbm_dd_string + unit
case "JR":
result = Dept_zw_qbbm_jr_string + unit
case "TXHD":
result = Dept_zw_qbbm_txhd_string + unit
case "TXWJ":
result = Dept_zw_qbbm_txwj_string + unit
case "JS":
result = Dept_zw_qbbm_js_string + unit
case "JD":
result = Dept_zw_qbbm_jd_string + unit
case "HW":
result = Dept_zw_qbbm_hw_string + unit
case "DY":
result = Dept_zw_qbbm_dy_string + unit
case "BGYJ":
result = Dept_zw_qbbm_bgyj_string + unit
}
return result
}
......@@ -14,12 +14,14 @@ const SymbolDH = "、"
// AD-Control //
const Version string = "2.6.0"
const Version string = "2.6.1"
const Host_adserver_lan string = "192.168.0.20"
const Host_adserver_wan string = "115.231.214.234"
const Host_adserver string = "ADSERVER"
const Host_thserver string = "THSERVER"
const Host_thserver_lan string = "192.168.2.3"
const Host_zzserver string = "ZZSERVER"
const Host_zzserver_lan string = "192.168.27.2"
const DaemonListen string = ":16823"
const DaemonLogListen string = ":16824"
......
......@@ -143,7 +143,9 @@ func (rep *MJreport) MsgDeal() interface{} {
case Msg_Report_WillLogInUser:
l := fmt.Sprintf("%s 在 %s 登陆", rep.DataStr, rep.Computername)
LOG(INFO, rep.Instruction, l)
SendWXWrokTextToChatAccountManager(l)
if err := SendWXWrokTextToChatAccountManager(l); err != nil {
LOG(ERROR, rep.Instruction, err.Error())
}
case Msg_Report_WillLogOutUser:
l := fmt.Sprintf("%s 在 %s 注销", rep.DataStr, rep.Computername)
......@@ -300,7 +302,8 @@ func (rep *MJreport) MsgDeal() interface{} {
break
}
LOG(INFO, rep.Instruction, dept+name+" 个人账号注销完成")
rep.SendWXwork("个人账号注销完成")
SendWxworkTextToHR(dept + name + " 个人账号注销完成")
}
// 获取软件文件名
......@@ -330,6 +333,63 @@ func (rep *MJreport) MsgDeal() interface{} {
case Msg_status_deal:
MS.S = rep.Explain
}
// LDAP中移动到安装目录
case Msg_Report_MoveLDAPInstall:
switch rep.Status {
case Msg_status_commit:
hostname := strings.TrimRight(rep.Username, "$")
LOG(INFO, rep.Instruction, hostname+"移动到安装目录")
region, err := GetPostationFromHostname(hostname)
if err != nil {
LOG(WARN, rep.Instruction, err)
break
}
d := fmt.Sprintf(`(Get-ADComputer %s).DistinguishedName`, hostname)
dout, err := PSCommandOutput(d)
if err != nil {
LOG(ERROR, rep.Instruction, err.Error()+dout)
break
}
ou := strings.Split(dout, SymbolSplit)
if ou[2] == "OU=Doc" {
LOG(INFO, rep.Instruction, hostname+"移动到情报目录")
ps := fmt.Sprintf(`Get-ADComputer %s | Move-ADObject -TargetPath (Get-ADOrganizationalUnit -Filter "Name -eq '%s'" -searchbase 'OU=情报部门,DC=zhiweireach,DC=com' | Where-Object -filter {$_.DistinguishedName -like "*%s*"}).DistinguishedName`, hostname, GetLDAPDeptFromHostnameP2(strings.Split(hostname, SymbolHostname)[1], false), Dept_qbbm_cmdb_ldap[region])
out, err := PSCommandOutput(ps)
if err != nil {
LOG(ERROR, rep.Instruction, err.Error()+out)
break
}
if err := RestartRemotePCForNow(hostname); err != nil {
LOG(ERROR, rep.Instruction, "error restart "+hostname)
}
} else if ou[1] == "OU=Doc" {
LOG(INFO, rep.Instruction, hostname+"移动到安装目录")
ps := fmt.Sprintf(`Get-ADComputer %s | Move-ADObject -TargetPath (Get-ADOrganizationalUnit -Filter "Name -eq '%s'" -searchbase 'OU=Doc,DC=zhiweireach,DC=com').DistinguishedName`, hostname, Dept_qbbm_cmdb_ldap[region])
out, err := PSCommandOutput(ps)
if err != nil {
LOG(ERROR, rep.Instruction, err.Error()+out)
break
}
if err := RestartRemotePCForNow(hostname); err != nil {
LOG(ERROR, rep.Instruction, "error restart "+hostname)
}
} else {
LOG(ERROR, rep.Instruction, hostname+"异常LDAP:"+dout)
}
case Msg_status_deal:
for {
Execcmd_wait(`gpupdate /force /boot`)
Delay(30)
RestartPCForNow()
}
}
default:
LOG(ERROR, "Default Report Json", rep.Instruction)
}
......@@ -623,7 +683,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name))
if err := RestartPCForNow(pc); err != nil {
if err := RestartRemotePCForNow(pc); err != nil {
LOG(ERROR, wxwork.Instruction, err)
wxwork.SendText(Error_WXWork_Fail_ReTry)
return
......@@ -682,7 +742,7 @@ func (wxwork *MJwxwork) MsgDealSend() {
LOG(INFO, wxwork.Instruction, fmt.Sprintf("host:%s,name:%s", pc, wxwork.Name))
if err := ShutdownPCForNow(pc); err != nil {
if err := ShutdownRemotePCForNow(pc); err != nil {
LOG(ERROR, wxwork.Instruction, err)
wxwork.SendText(Error_WXWork_Fail_ReTry)
return
......
......@@ -39,6 +39,7 @@ const Msg_Report_SignUPUser string = "SignUPUser"
const Msg_Report_Dimission string = "Dimission"
const Msg_Report_GetSoftlike string = "GetSoftlike"
const Msg_Report_GetURL string = "GetURL"
const Msg_Report_MoveLDAPInstall string = "MoveLDAPInstall"
// msg exec type ////////////////////////////////////////////////////////////////
......
......@@ -206,8 +206,8 @@ func SendWxworkTextToAdmins(nameOrID string) error {
func SendWxworkTextToHR(nameOrID string) error {
return SendWxworkTextToAUser("TaoTengFei|BaoJiaQi|BianShuang", nameOrID)
}
func SendWXWrokTextToChatAccountManager(Conentstring string) error {
return SendWXWrokTextToChat(WXWORK_zwDevopsChatAccountManager, Conentstring)
func SendWXWrokTextToChatAccountManager(content string) error {
return SendWXWrokTextToChat(WXWORK_zwDevopsChatAccountManager, content)
}
// 根据主机位置定义发送的服务器
......
......@@ -69,7 +69,7 @@ func Adserver() bool {
func DomainCotroller() bool {
var r bool
switch User_computername {
case Host_adserver:
case Host_adserver:fmt.Printf("分发d'd", var)
r = true
case Host_thserver:
r = true
......@@ -87,9 +87,6 @@ func GetHostnamePart(hostname string) ([]string, error) {
}
return n, nil
}
func GetIPFromInterface() {
}
// 判断计算机是否在zhiweireach中
func Zhiweireach() bool {
......
......@@ -52,7 +52,6 @@ func execcmd_base(cmdargs string) (string, []string, error) {
app = cmdargs
appargs[0] = ""
}
fmt.Println(cmdargs)
LOG(INFO, "CMD", cmdargs)
return app, appargs, nil
}
......@@ -184,6 +183,24 @@ func PSCommandOutput(cmd string) (string, error) {
}
return strings.TrimSpace(string(out)), nil
}
func PSCommandPromptWait(cmd string) error {
if cmd == "" {
return Error_Lost_Parameter
}
cmd = "powershell -command " + cmd
app, appargs, err := execcmd_base(cmd)
if err != nil {
return err
}
r := exec.Command(app, appargs...)
if err := r.Start(); err != nil {
return err
}
if err := r.Wait(); err != nil {
return err
}
return err
}
func PSCommandWait(cmd string) error {
if cmd == "" {
return Error_Lost_Parameter
......@@ -592,7 +609,7 @@ func GetIPFromNslookup() string {
}
for _, line := range strings.Split(result, "\n") {
ip := strings.Split(line, ".")
if ip[0] == "192" && ip[1] == "168" && len(ip[2]) == 1 {
if ip[0] == "192" && ip[1] == "168" && len(ip[2]) == 1 && (ip[2] == "0" || ip[2] == "1" || ip[2] == "2" || ip[2] == "27") {
return line
}
}
......@@ -619,12 +636,25 @@ func GetMacaddressFromIP(ip string) string {
result, _ := PSCommandOutputNoSplit(cmd)
return strings.TrimSpace(result)
}
func GetPrimaryDNSFromIP(ip string) string {
cmd := fmt.Sprintf(`(Get-NetAdapter -ifindex ((Get-NetIPAddress -IPAddress %s).InterfaceIndex) | Get-DnsClientServerAddress -AddressFamily IPV4 ).ServerAddresses`, ip)
result, _ := PSCommandOutputNoSplit(cmd)
result = strings.TrimSpace(result)
if strings.Contains(result, "\n") {
return strings.Split(result, "\n")[0]
}
return result
}
// 电源管理
func RestartPCForNow(pc string) error {
func RestartRemotePCForNow(pc string) error {
return Execcmd_nowait(fmt.Sprintf(`shutdown -r -t 0 -m \\%s`, pc))
}
func RestartPCForNow() error {
return Execcmd_nowait(`shutdown -r -t -0`)
}
func ShutdownPCForNow(pc string) error {
func ShutdownRemotePCForNow(pc string) error {
return Execcmd_nowait(fmt.Sprintf(`shutdown -s -t 0 -m \\%s`, pc))
}
......@@ -45,7 +45,14 @@ func Query_ADPC(key string) string {
Exist_item(HKCU, REG_ADCONTROL)
return Query_key_one(HKCU, REG_ADCONTROL, key)
}
func Write_ADPCLM(key, value string) {
Exist_item(HKLM, REG_ADCONTROL)
Write_key_one(HKLM, REG_ADCONTROL, key, value)
}
func Query_ADPCLM(key string) string {
Exist_item(HKLM, REG_ADCONTROL)
return Query_key_one(HKLM, REG_ADCONTROL, key)
}
func Exist_item(root int, path string) {
registry.CreateKey(prase(&root), path, registry.ALL_ACCESS)
}
......
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