Commit 46ab9836 by 陶腾飞

update

parent 42060ed5
...@@ -8,13 +8,17 @@ import ( ...@@ -8,13 +8,17 @@ import (
func main(){ func main(){
var logpath string var logpath string
if pub.Adserver() { if pub.Adserver() {
logpath = `F:\logs\` logpath = pub.Dir_AD_log
} else { } else {
logpath = pub.Dir_userprofile if pub.RunAsPC(pub.User_computername){
logpath = `C:\windows\system32\`
}else{
logpath = pub.Dir_userprofile + `\`
}
//pub.AutoFillInWeDriveDir() //pub.AutoFillInWeDriveDir()
} }
pub.Loger = pub.NewLoger(logpath + `\adct.log`) pub.Loger = pub.NewLoger(logpath + `adct.log`)
//pub.PrintLog("start adct") //pub.PrintLog("start adct")
var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD") var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD")
...@@ -118,7 +122,7 @@ func flag_wolall(pass * string){ ...@@ -118,7 +122,7 @@ func flag_wolall(pass * string){
continue continue
}else{ }else{
if limit <= 10 { if limit <= 10 {
pub.Delay(60) pub.Delay(10)
limit=0 limit=0
} }
pub.PrintLog(i,pc,mac) pub.PrintLog(i,pc,mac)
......
...@@ -3,47 +3,21 @@ package main ...@@ -3,47 +3,21 @@ package main
import ( import (
pub "AD-Control/public" pub "AD-Control/public"
"net" "net"
"io"
"bufio" "bufio"
) )
// 守护进程 初始化 // 守护进程 初始化
func daemonInit(){ func daemonInit(){
// 1 创建文件夹 if !pub.Adserver(){pub.Exit()}
for _,i := range pub.Dir_Be{
if pub.NotExist(i){
pub.Mkdir(i)
}
}
var logpath string
if pub.Adserver() {
// 2 初始化 微盘复制状态
pub.CopyStatusWeDrive = make(map[string]bool)
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_HB] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_LP] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_JR] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_JD] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_TXHD] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_TXWJ] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_BGYJZX] = true
pub.CopyStatusWeDrive[pub.Zhiwei_Dept_TECH] = true
// 日志文件位置:主控源文件的源文件目录 // 写入日志
logpath = `F:\logs\daemon.log` pub.Loger = pub.NewLoger(pub.Dir_AD_log + `daemon.log`)
} else {
// 日志文件位置:域计算机的备份目录:C:\windows\temp
logpath = pub.Dir_tmp + `\daemon.log`
}
//3 写入日志
pub.Loger = pub.NewLoger(logpath)
} }
// 守护进程 运行 // 守护进程 运行
func deamonRun(){ func deamonRun(){
daemonHost := pub.User_computername listener, err := net.Listen("tcp",pub.DaemonListen)
listener, err := net.Listen("tcp", pub.DaemonListen)
if err != nil { if err != nil {
pub.PntError("Listen Error ", err) pub.PntError("Listen Error ", err)
return return
...@@ -53,29 +27,27 @@ func deamonRun(){ ...@@ -53,29 +27,27 @@ func deamonRun(){
for{ for{
if conn, err := listener.Accept(); err == nil { if conn, err := listener.Accept(); err == nil {
// 新建 读取流 // 新建 读取流
if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(pub.EndSign) ; cerr != io.EOF { bmsg,_:= bufio.NewReader(conn).ReadBytes(pub.EndSign)
// 获取ip // 获取ip
ip := pub.GetConnIP(conn.RemoteAddr()) ip := pub.GetConnIP(conn.RemoteAddr())
// 获取消息类型 // 获取消息类型
msgtype := pub.ParseJsonHead(bmsg) msgtype := pub.GetMsgType(bmsg[0:30])
// 处理消息 // 处理消息
rec := pub.DealMsgEnter(ip,msgtype,bmsg) rec := pub.DealMsgEnter(ip,msgtype,bmsg)
// 写入连接 // 写入连接
conn.Write(rec) conn.Write(rec)
}else{
pub.PntError(daemonHost," Conn Read Error ", cerr)
}
// 关闭连接 // 关闭连接
if err := conn.Close() ; err!= nil{ if err := conn.Close() ; err!= nil{
pub.PntInfo(err) pub.PntInfo(err)
} }
continue continue
}else{ }else{
pub.PntError(daemonHost," Listen Error ", err) pub.PntError(" Listen Error", err)
} }
} }
...@@ -84,5 +56,4 @@ func deamonRun(){ ...@@ -84,5 +56,4 @@ func deamonRun(){
func main() { func main() {
daemonInit() daemonInit()
deamonRun() deamonRun()
} }
\ No newline at end of file
package public package public
// AD-Control // // AD-Control //
const Host_adserver string = "ADSERVER" const Host_adserver string = "ADSERVER"
const DaemonPort string = "16823" const DaemonPort string = "16824"
const DaemonListen string = ":" + DaemonPort const DaemonListen string = ":" + DaemonPort
const ADServerDaemon string = Host_adserver + DaemonListen const ADServerDaemon string = Host_adserver + DaemonListen
var LocalDaemon string = User_computername + DaemonListen const WxwrokDaemon string = ":16823"
const RandMax int = 60 const RandMax int = 60
const Version string = "1.2.0" const Version string = "1.3.0"
// user // // user //
...@@ -45,13 +44,14 @@ var Dir_appdata string = GetEnv("appdata") ...@@ -45,13 +44,14 @@ var Dir_appdata string = GetEnv("appdata")
var Dir_tmp string = GetEnv("tmp") var Dir_tmp string = GetEnv("tmp")
var Dir_Windows string = GetEnv("windir") + `\` var Dir_Windows string = GetEnv("windir") + `\`
const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\` const Dir_DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const Dir_ADsoftware_local string = `F:\software\softlike\` const Dir_ADsoftware_local string = `H:\software\softlike\`
const Dir_dept_share string = "办公室部门内部共享" const Dir_dept_share string = "办公室部门内部共享"
var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share
const Dir_DCSave string = `D:\DomainUserBackupV2` const Dir_DCSave string = `D:\DomainUserBackupV2`
var Dir_WeDrive = [2] string {Dir_appdata + `\Tencent\WXWork\Data`,Dir_userprofile + `\Documents\WXWork`} var Dir_WeDrive = [2] string {Dir_appdata + `\Tencent\WXWork\Data`,Dir_userprofile + `\Documents\WXWork`}
var Dir_Be = []string {Dir_DocuBase} var Dir_Be = []string {Dir_DocuBase}
var Dir_Sync_Config string = Dir_appdata + `\Sync App Settings\_SYNCAPP\` var Dir_Sync_Config string = Dir_appdata + `\Sync App Settings\_SYNCAPP\`
var Dir_AD_log string = `H:\logs\`
// Local File // // Local File //
...@@ -73,7 +73,7 @@ const App_Sync_dir string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe ...@@ -73,7 +73,7 @@ const App_Sync_dir string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe
// backup // // backup //
var Bak_Version string = "0709" var Bak_Version string = "0710"
// reg info // // reg info //
...@@ -87,6 +87,7 @@ const Reg_Root_ac int = HKLM ...@@ -87,6 +87,7 @@ const Reg_Root_ac int = HKLM
const Reg_Root_dc int = HKCU const Reg_Root_dc int = HKCU
const Reg_Path_home string = `SOFTWARE\ADControl` const Reg_Path_home string = `SOFTWARE\ADControl`
const Reg_Path_home_ac string = Reg_Path_home + `\DomainComputer\` // use for adserver,not for dc const Reg_Path_home_ac string = Reg_Path_home + `\DomainComputer\` // use for adserver,not for dc
const Reg_Path_home_du string = Reg_Path_home + `\DomainUsers\` // use for adserver,not for dc
const Reg_Name_TurnOnTime string = "TurnOnTime" const Reg_Name_TurnOnTime string = "TurnOnTime"
const Reg_Name_TurnOffTime string = "TurnOffTime" const Reg_Name_TurnOffTime string = "TurnOffTime"
const Reg_Name_LoginUserName string = "loginUser" const Reg_Name_LoginUserName string = "loginUser"
...@@ -95,16 +96,18 @@ const Reg_Name_LogOffTime string = "LogOffTime" ...@@ -95,16 +96,18 @@ const Reg_Name_LogOffTime string = "LogOffTime"
const Reg_Name_BackupOverTime string = "BackupOverTime" const Reg_Name_BackupOverTime string = "BackupOverTime"
const Reg_Name_WeDriveDir string = "WeDriveDir" const Reg_Name_WeDriveDir string = "WeDriveDir"
const Reg_Name_MACaddress string = "MACaddress" const Reg_Name_MACaddress string = "MACaddress"
const Reg_Name_MACAddress string = "MACAddress"
const Reg_Name_PrimaryUser string = "PrimaryUser" const Reg_Name_PrimaryUser string = "PrimaryUser"
const Reg_Name_PowerStatus string = "PowerStatus" const Reg_Name_PowerStatus string = "PowerStatus"
const Reg_Name_LogStatus string = "LogStatus" const Reg_Name_LogStatus string = "LogStatus"
const Reg_Name_BackupVersion string = "BackupVersion" const Reg_Name_BackupVersion string = "BackupVersion"
const Reg_Name_PrimayComputerName string = "PrimayComputerName"
const Reg_Name_BeWakedID string = "BeWakedID"
// reg value // // reg value //
var Reg_Value_WeDriveDir string = Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir) var Reg_Value_WeDriveDir string = Reg_query_key_one(HKCU,Reg_Path_home,Reg_Name_WeDriveDir)
var Reg_Value_PowerStatus_ON string = "ON" var Reg_Value_ON string = "ON"
var Reg_Value_PowerStatus_OFF string = "OFF" var Reg_Value_OFF string = "OFF"
var Reg_Value_LogStatus_IN string = "IN" var Reg_Value_LogStatus_IN string = "IN"
var Reg_Value_LogStatus_OUT string = "OUT" var Reg_Value_LogStatus_OUT string = "OUT"
...@@ -116,3 +119,14 @@ const Cmd_k string = "cmd /k " ...@@ -116,3 +119,14 @@ const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start " const Cmd_K_Start string = "cmd /k start "
var CopyStatusWeDrive map [string]bool var CopyStatusWeDrive map [string]bool
// wxwork key //
const WXTokenMsgSend string ="AvAQlFNxy1UQB3CjRml3GfKf7Y"
const WxworkEncodingAseKey string = "AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy"
const WxworkReceiverId string = "ww49cfd580625083c9"
const WxworkCorid string = "ww49cfd580625083c9"
const WxworkCorpSecret string = "ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I"
// wxwork answaer //
const WXRec_WakeSuccess string = "主机已启动!"
\ No newline at end of file
...@@ -2,15 +2,27 @@ package public ...@@ -2,15 +2,27 @@ package public
import ( import (
"errors" "errors"
) )
var Error_NullCommand = errors.New("NULL COMMAND ") var Error_Lost_Parameter = errors.New("Lost Paramter")
var Error_NullRegQuery = errors.New("Null Reg Query")
var Error_Null_Command = errors.New("NULL COMMAND")
var Error_Null_RegQuery = errors.New("Null Reg Query")
var Error_Null_Folder_WeDrive = errors.New("Not Find Folder WxDrive ") var Error_Null_Folder_WeDrive = errors.New("Not Find Folder WxDrive ")
var Error_Null_App_Sync = errors.New("Not Find Application AllWay Sync") var Error_Null_App_Sync = errors.New("Not Find Application AllWay Sync")
var Error_Null_File = errors.New("Not Find File") var Error_Null_File = errors.New("Not Find File")
var Error_Null_Folder = errors.New("Not File Folder") var Error_Null_Folder = errors.New("Not File Folder")
var Error_Null_Icon_File = errors.New("Not File Icon File") var Error_Null_Icon_File = errors.New("Not File Icon File")
var Error_Fail_File_Open = errors.New("Fail File Open") var Error_Fail_File_Open = errors.New("Fail File Open")
var Error_Fail_Token = errors.New("Get Token Fail")
var Error_Fail_File_Write = errors.New("Fail File Write") var Error_Fail_File_Write = errors.New("Fail File Write")
var Error_Not_Msg = errors.New("isn't defined msg") var Error_Fail_TCP_STR = "ERROR"
\ No newline at end of file var Error_Not_Msg = errors.New("isn't defined msg")
var Error_WXWork_Down = errors.New(Error_WXWork_Down_STR)
var Error_WXWork_Down_STR = "后台错误"
func NewError(s string) error{
return errors.New(s)
}
\ No newline at end of file
...@@ -6,6 +6,7 @@ package public ...@@ -6,6 +6,7 @@ package public
// //
func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte { func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
var ret interface{} var ret interface{}
switch msgtype{ switch msgtype{
// 报告 消息 // 报告 消息
...@@ -43,12 +44,17 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte { ...@@ -43,12 +44,17 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
ParseJsonBody(unmsg,&pmsg) ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal() ret = pmsg.Msg_Deal()
return nil return nil
case Msg_Wxwork:
var pmsg MJwxwork
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
} }
return JsonToByte(&ret) return JsonToByte(&ret)
} }
// //
// //
// 具体消息实现 // 具体消息实现
...@@ -93,46 +99,55 @@ func (rep *MJreport)Msg_Deal() interface{} { ...@@ -93,46 +99,55 @@ func (rep *MJreport)Msg_Deal() interface{} {
return GJbackup() return GJbackup()
case Msg_Report_OverBak: case Msg_Report_OverBak:
rep.Reg_Write_AC(Reg_Name_BackupOverTime,UnixTimeParse(&rep.Timestamp)) rep.Reg_Write_ADDC(Reg_Name_BackupOverTime,UnixTimeParse(&rep.Timestamp))
rep.Pskill(App_Sync) rep.Pskill(App_Sync)
SysMsgBox(rep.Computername,`备份完成,即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`) SysMsgBox(rep.Computername,`备份完成,即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`)
return GJexecAck(Msg_Exec_TurnOffPC) return GJexecAck(Msg_Exec_TurnOffPC)
case Msg_Report_WillTurnOffPC: case Msg_Report_WillTurnOffPC:
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_TurnOffTime, Reg_Name_TurnOffTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_PowerStatus, Reg_Name_PowerStatus,
Reg_Value_PowerStatus_OFF) Reg_Value_OFF)
case Msg_Report_WillTurnOnPC: case Msg_Report_WillTurnOnPC:
rep.Reg_Write_AC(
// 如果是被开机唤醒o
id := rep.Reg_Query_ADDC(Reg_Name_BeWakedID)
if id != ""{
SendWxworkTextToAUser(id,WXRec_WakeSuccess)
rep.Reg_Write_ADDC(Reg_Name_BeWakedID,"")
}
// 记录 开机 时间
rep.Reg_Write_ADDC(
Reg_Name_TurnOnTime, Reg_Name_TurnOnTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC( //记录 电源状态
rep.Reg_Write_ADDC(
Reg_Name_PowerStatus, Reg_Name_PowerStatus,
Reg_Value_PowerStatus_ON) Reg_Value_ON)
case Msg_Report_WillLogInUser: case Msg_Report_WillLogInUser:
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LoginUserName, Reg_Name_LoginUserName,
rep.Username) rep.Username)
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LoginTime, Reg_Name_LoginTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LogStatus, Reg_Name_LogStatus,
Reg_Value_LogStatus_IN) Reg_Value_LogStatus_IN)
case Msg_Report_WillLogOutUser: case Msg_Report_WillLogOutUser:
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LoginUserName, Reg_Name_LoginUserName,
rep.Username) rep.Username)
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LogOffTime, Reg_Name_LogOffTime,
UnixTimeParse(&rep.Timestamp)) UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC( rep.Reg_Write_ADDC(
Reg_Name_LogStatus, Reg_Name_LogStatus,
Reg_Value_LogStatus_OUT) Reg_Value_LogStatus_OUT)
...@@ -329,4 +344,48 @@ func (reg * MJreg)Msg_Deal() interface{}{ ...@@ -329,4 +344,48 @@ func (reg * MJreg)Msg_Deal() interface{}{
func (err * MJerror)Msg_Deal() interface{}{ func (err * MJerror)Msg_Deal() interface{}{
//SendWX(err.Instruction) //SendWX(err.Instruction)
return nil return nil
} }
\ No newline at end of file
// 关于 wxwork 企业微信 的 消息处理
func (wxwork * MJwxwork)Msg_Deal() interface{}{
switch (wxwork.Instruction){
case Msg_Wxwork_UserWake:
// 在注册表中查询记录
pc := wxwork.Reg_Query_ADUsers(Reg_Name_PrimayComputerName)
mac := wxwork.Reg_Query_ADUsers(Reg_Name_MACAddress)
if pc == "" || mac == ""{
wxwork.Text ="如果你不是情报部门,那么暂时还不支持该功能"
return wxwork
}
// 查看电源状态
status,err := PSTest_Connection(pc)
PrintLog(pc,mac,wxwork.Name,Msg_Wxwork_UserWake,status)
if err !=nil{
wxwork.Text = Error_WXWork_Down_STR
return wxwork
}
if status {
wxwork.Text = "已经开机了哦~"
return wxwork
}
// 写入被唤醒的ID用于判断是否是被企业微信唤醒
Reg_Write_ADDC(pc,Reg_Name_BeWakedID,wxwork.UserID)
// 由于不能在5秒内回复消息,需要使用go关键词
go Wol(mac)
wxwork.Text = "开始唤醒,请等待~"
default:
wxwork.Text = ""
}
return wxwork
}
package public package public
//
//
// msg env //////////////////////////////////////////////////////////////// // msg env ////////////////////////////////////////////////////////////////
//
const EndSign byte = 125 const EndSign byte = 125
const msgerror string = "error" const msgerror string = "error"
// msg type //////////////////////////////////////////////////////////////// // msg type ////////////////////////////////////////////////////////////////
const Msg_Report string = "report" const Msg_Report string = "report"
...@@ -16,9 +15,12 @@ const Msg_Exec string = "exec" ...@@ -16,9 +15,12 @@ const Msg_Exec string = "exec"
const Msg_Backup string = "backup" const Msg_Backup string = "backup"
const Msg_Reg string = "reg" const Msg_Reg string = "reg"
const Msg_Error string = "error" const Msg_Error string = "error"
const Msg_Wxwork string = "wxwork"
// base word //////////////////////////////////////////////////////////////// // base word ////////////////////////////////////////////////////////////////
const LogInUser string = "LogInUser" const LogInUser string = "LogInUser"
const LogOutUser string = "LogOutUser" const LogOutUser string = "LogOutUser"
const WillLogInUser string = "WillLogInUser" const WillLogInUser string = "WillLogInUser"
...@@ -28,6 +30,9 @@ const TurnOffPC string = "TurnOffPC" ...@@ -28,6 +30,9 @@ const TurnOffPC string = "TurnOffPC"
const WillTurnOnPC string = "WillTurnOnPC" const WillTurnOnPC string = "WillTurnOnPC"
const WillTurnOffPC string = "WillTurnOffPC" const WillTurnOffPC string = "WillTurnOffPC"
// msg report type /////////////////////////////////////////////////////////// // msg report type ///////////////////////////////////////////////////////////
const Msg_Report_LoginInUser string = LogInUser const Msg_Report_LoginInUser string = LogInUser
...@@ -44,12 +49,16 @@ const Msg_Report_StartBak string = "startbak" ...@@ -44,12 +49,16 @@ const Msg_Report_StartBak string = "startbak"
const Msg_Report_OverBak string = "stopbak" const Msg_Report_OverBak string = "stopbak"
const Msg_Report_DCInfo string = "DCInfo" const Msg_Report_DCInfo string = "DCInfo"
// msg backup type ////////////////////////////////////////////////////////////// // msg backup type //////////////////////////////////////////////////////////////
const Msg_Backup_Status_Start string = "start" const Msg_Backup_Status_Start string = "start"
const Msg_Backup_Status_Continue string = "Continue" const Msg_Backup_Status_Continue string = "Continue"
const Msg_Backup_Status_Run string = "run" const Msg_Backup_Status_Run string = "run"
// msg exec type //////////////////////////////////////////////////////////////// // msg exec type ////////////////////////////////////////////////////////////////
const ( const (
...@@ -73,7 +82,7 @@ const Msg_Exec_CopyWeDrive string = "copyWeDrive" ...@@ -73,7 +82,7 @@ const Msg_Exec_CopyWeDrive string = "copyWeDrive"
const Msg_Exec_CopyDeptShare string = "copydeptshare" const Msg_Exec_CopyDeptShare string = "copydeptshare"
const Msg_Exec_GUIExec string = "guiexec" const Msg_Exec_GUIExec string = "guiexec"
const Msg_Wxwork_UserWake string = "UserWake"
// //
const ( const (
Msg_Reg_Query = iota Msg_Reg_Query = iota
...@@ -131,6 +140,15 @@ type MJreg struct{ ...@@ -131,6 +140,15 @@ type MJreg struct{
type MJerror struct{ type MJerror struct{
MJbase MJbase
} }
type MJwxwork struct {
MsgType string `json:"msgtype"`
UserID string `json:"userid"`
Name string `json:"name"`
Instruction string `json:"instruction"`
Text string `json:"text"`
}
...@@ -140,6 +158,7 @@ type MJerror struct{ ...@@ -140,6 +158,7 @@ type MJerror struct{
// //
// Report // Report
func GJreport(s string) interface{}{ func GJreport(s string) interface{}{
...@@ -153,14 +172,14 @@ func GJreport_DCInfo(s string) interface{}{ ...@@ -153,14 +172,14 @@ func GJreport_DCInfo(s string) interface{}{
rep.Explain = s rep.Explain = s
return rep return rep
} }
func (rep * MJreport)Reg_Write_AC(key , value string){ func (rep * MJreport)Reg_Write_ADDC(key , value string){
Reg_Write_key_one( Reg_Write_key_one(
Reg_Root_ac, Reg_Root_ac,
Reg_Path_home_ac + rep.Computername, Reg_Path_home_ac + rep.Computername,
key, key,
value) value)
} }
func (rep * MJreport)Reg_Query_AC(key string) string{ func (rep * MJreport)Reg_Query_ADDC(key string) string{
return Reg_query_key_one( return Reg_query_key_one(
Reg_Root_ac, Reg_Root_ac,
Reg_Path_home_ac + rep.Computername, Reg_Path_home_ac + rep.Computername,
...@@ -233,10 +252,10 @@ func (exec * MJexec)init(s string){ ...@@ -233,10 +252,10 @@ func (exec * MJexec)init(s string){
exec.SessionID = User_sessionID exec.SessionID = User_sessionID
exec.Cmder = Msg_Exec_Cmder_LocalDaemon exec.Cmder = Msg_Exec_Cmder_LocalDaemon
exec.Status = Msg_Exec_State_Request exec.Status = Msg_Exec_State_Request
exec.Timestamp = NowTimestamp()
} }
// Backup // Backup
func GJbackup()interface{}{ func GJbackup()interface{}{
...@@ -252,6 +271,7 @@ func (bak * MJbackup)init() { ...@@ -252,6 +271,7 @@ func (bak * MJbackup)init() {
} }
// error // error
func GJerror(e error)interface{}{ func GJerror(e error)interface{}{
...@@ -267,3 +287,25 @@ func (err * MJerror)init (e error){ ...@@ -267,3 +287,25 @@ func (err * MJerror)init (e error){
err.MsgType = Msg_Error err.MsgType = Msg_Error
err.Instruction = e.Error() err.Instruction = e.Error()
} }
func GJwxworkText(name, userid,text * string,instruction string )interface {}{
var wxwork MJwxwork
wxwork.MsgType = Msg_Wxwork
wxwork.Name = *name
wxwork.UserID = *userid
wxwork.Text = *text
wxwork.Instruction = instruction
return wxwork
}
// wxwork
func (wxwork * MJwxwork)SendTextToAUser() error {
return SendWxworkTextToAUser(wxwork.UserID,wxwork.Text)
}
func (wxwork * MJwxwork)Reg_Query_ADUsers(key string) string{
return Reg_query_key_one(
Reg_Root_ac,
Reg_Path_home_du + wxwork.Name,
key)
}
\ No newline at end of file
...@@ -2,10 +2,31 @@ package public ...@@ -2,10 +2,31 @@ package public
import ( import (
"log" "log"
"os" "os"
"fmt"
) )
var Loger * log.Logger var Loger * log.Logger
func NewLoger(s string) * log.Logger{
var Log_file_obj * os.File
var err error
if Log_file_obj,err = os.OpenFile(
s,os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766);
err !=nil && DomainComputer(){
SendServerErrorf("%s %v-%v",s,Error_Fail_File_Open,err)
}
return log.New(Log_file_obj,"",log.LstdFlags)
}
func Sprintf(f string,v ...interface{})string {
return fmt.Sprintf(f,v ...)
}
//
//
// Print Type
//
func PrintLog(v ...interface{}){ func PrintLog(v ...interface{}){
log.SetPrefix("Output ") log.SetPrefix("Output ")
log.Println(v ...) log.Println(v ...)
...@@ -60,13 +81,25 @@ func PntSend(v ...interface{}){ ...@@ -60,13 +81,25 @@ func PntSend(v ...interface{}){
Loger.SetPrefix("Send ") Loger.SetPrefix("Send ")
Loger.Println(v ...) Loger.Println(v ...)
} }
func NewLoger(s string) * log.Logger{ func PrintPrefix(s string ,v ...interface{}){
var Log_file_obj * os.File Loger.SetPrefix(s)
var err error PrintLog(v ...)
if Log_file_obj,err = os.OpenFile( Loger.Println(v ...)
s,os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766); }
err !=nil && DomainComputer(){
SendServerErrorf("%s %v-%v",s,Error_Fail_File_Open,err)
} func PntWxwork(v ...interface{}){
return log.New(Log_file_obj,"",log.LstdFlags) Loger.SetPrefix("WXWORK")
PrintLog(v ...)
Loger.Println(v ...)
}
func PntWxworkf(f string,v ...interface{}){
Loger.SetPrefix("WXWORK")
log.Printf(f,v ...)
Loger.Printf(f,v ...)
}
func PntWxSendMsgText(v ...interface{}){
Loger.SetPrefix("WxSendMsgText")
PrintLog(v ...)
Loger.Println(v ...)
} }
...@@ -11,21 +11,20 @@ import ( ...@@ -11,21 +11,20 @@ import (
// 获取 环境变量 // 获取 环境变量
// 如果空 输出错误 // 如果空 输出错误
// 获取 消息内容 // 获取 消息类型
func ParseJsonHead(b []byte)string{ func GetMsgType(b []byte)string{
//{"msgtype":"report","msgstate":"","username":"zhiweiadserver","computername":"ADSERVER","report":"下班"} //{"msgtype":"report","...":"..."}
// 提取第一个冒号后的第二位和第一个逗号的前一位 // 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容 // 也就是msgtype的内容
msgtype := b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1] return string(b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1])
return string(msgtype)
} }
// 解析Json 并放到变量中 // 解析Json 并放到变量中
func ParseJsonBody(unmsg []byte,v interface{}){ func ParseJsonBody(unmsg []byte,v interface{}){
// 填写 // 填写
if err := json.Unmarshal(unmsg,v) ;err != nil{ if err := json.Unmarshal(unmsg,v) ;err != nil{
PntError("Parse Json Error ",err) PntError("Parse Json Error",err)
PntError("Parse Json Error",string(unmsg))
} }
} }
...@@ -170,3 +169,21 @@ func GetWeDriveVersion() (int,string,error) { ...@@ -170,3 +169,21 @@ func GetWeDriveVersion() (int,string,error) {
return 1,"233",Error_Null_Folder_WeDrive return 1,"233",Error_Null_Folder_WeDrive
} }
} }
func GetWXWorkToken() (string,error) {
link := Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s",WxworkCorid,WxworkCorpSecret)
data,err := SendGetRequest(&link)
if err !=nil {
return "",err
}
var wt WxToken
ParseJsonBody(data,&wt)
if wt.Errcode== 0 {
return wt.Access_token,nil
} else {
PntError(err)
return "",Error_Fail_File_Write
}
}
\ No newline at end of file
...@@ -4,77 +4,103 @@ import ( ...@@ -4,77 +4,103 @@ import (
"encoding/json" "encoding/json"
"net" "net"
"net/http" "net/http"
"io" "io/ioutil"
"bytes" "bytes"
"bufio" "bufio"
"io"
"fmt" "fmt"
) )
func SendDaemon(v interface{})[]byte{
return SendMsg(LocalDaemon,v)
}
func SendDaemonExec(s string){ func SendServerReport(s string)([]byte,error){
SendDaemon(GJexecUserCmd(s))
}
func SendServerReport(s string)[]byte{
return SendServer(GJreport(s)) return SendServer(GJreport(s))
} }
func SendServerDCInfo(s string)[]byte{ func SendServerDCInfo(s string)([]byte,error){
return SendServer(GJreport_DCInfo(s)) return SendServer(GJreport_DCInfo(s))
} }
func SendServerExec(s string)[]byte{ func SendServerExec(s string)([]byte,error){
return SendServer(GJexec(s)) return SendServer(GJexec(s))
} }
func SendServerGUIExec(s string){ func SendServerGUIExec(s string){
SendServer(GJexecGUI(s)) SendServer(GJexecGUI(s))
} }
func SendServerError(err error)[]byte{ func SendServerError(err error)([]byte,error){
return SendServer(GJerror(err)) return SendServer(GJerror(err))
} }
func SendServerErrorf(f string, a ...interface{}) []byte { func SendServerErrorf(f string, a ...interface{}) ([]byte,error) {
return SendServer(GJerror(fmt.Errorf(f,a ...))) return SendServer(GJerror(fmt.Errorf(f,a ...)))
} }
// send to server // send to server
func SendServer(v interface{})[]byte{ func SendServer(v interface{}) ([]byte,error){
if Adserver() {return nil} //if Adserver() {return nil}
return SendMsg(ADServerDaemon,v) return SendMsg(ADServerDaemon,v)
} }
// base // base
func SendMsg(you string ,v interface{})[]byte{ func SendMsg(you string ,v interface{}) ([]byte,error){
textbyte,err := json.Marshal(v) textbyte,err := json.Marshal(v)
if err !=nil { if err !=nil {
PntError("Json to String Error ",v,err) PntError("Json to String Error ",v,err)
return nil,err
} }
conn, err := net.Dial("tcp", you) conn, err := net.Dial("tcp", you)
if err != nil { if err != nil {
PntError("err = ", err) PntError("err = ", err)
return nil,err
} }
defer conn.Close()
PntSend(string(textbyte))
//发送数据 //发送数据
conn.Write(textbyte) conn.Write(textbyte)
PntSend(string(textbyte))
bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign)
var rec []byte var rec []byte
if cerr != io.EOF { if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign);cerr == nil || cerr == io.EOF{
// 获取ip // 获取ip
ip := GetConnIP(conn.RemoteAddr()) ip := GetConnIP(conn.RemoteAddr())
// 获取消息类型 // 获取消息类型
msgtype := ParseJsonHead(bmsg) msgtype := GetMsgType(bmsg)
// 处理消息 // 处理消息
rec = DealMsgEnter(ip,msgtype,bmsg) rec = DealMsgEnter(ip,msgtype,bmsg)
// 写入连接
//conn.Write(rec)
}else{
PntError("Conn Read Error",cerr)
} }
if err := conn.Close();err !=nil{
PntError("Conn Close ",err) return rec,nil
}
// 发送Get请求
func SendGetRequest(link * string) ([]byte,error){
resp, err := http.Get(*link)
if err != nil {
return nil,err
} }
return rec defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
return body,err
} }
// 发送 带Data的Post请求
func SendPostRequestWithData(link * string,data interface {}) ([]byte,error){
resp, err := http.Post(
*link,
"application/json; charset=utf-8",
bytes.NewReader(JsonToByte(data)))
if err != nil {
return nil,err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
return body,err
}
// 发送 到 微信机器人 // 发送 到 微信机器人
func SendWX(Content string){ func SendWX(Content string){
...@@ -90,4 +116,36 @@ func SendWX(Content string){ ...@@ -90,4 +116,36 @@ func SendWX(Content string){
} }
}`) }`)
http.Post(Link_WxworkBot,"application/json; charset=utf-8",bytes.NewBuffer(w)) http.Post(Link_WxworkBot,"application/json; charset=utf-8",bytes.NewBuffer(w))
} }
\ No newline at end of file func SendWxworkTextToAUser(id,text string) error{
PntWxSendMsgText(id,text)
// 获取 最新 token
t,err := GetWXWorkToken()
if err !=nil{
return err
}
// 初始化 消息推送 结构体
var wsmt WxSendMsgText
wsmt.Init()
wsmt.Touser=id
wsmt.Text.Content=text
link:=Sprintf("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s",t)
// 发送 Post 请求
res,err := SendPostRequestWithData(&link,&wsmt)
if err !=nil {
return err
}
// 解析 Post 响应 数据
var wsmr WxSendMsgRec
ParseJsonBody(res,&wsmr)
if wsmr.ErrCode != 0{
return NewError(wsmr.ErrMsg)
}
return nil
}
...@@ -46,7 +46,7 @@ func GetEnvFqdn(s string)string{ ...@@ -46,7 +46,7 @@ func GetEnvFqdn(s string)string{
func execcmd_base(cmdargs string) (string,[]string,error){ func execcmd_base(cmdargs string) (string,[]string,error){
if cmdargs == "" { if cmdargs == "" {
return "",nil,Error_NullCommand return "",nil,Error_Null_Command
} }
var app string var app string
...@@ -128,6 +128,26 @@ func Execcmd_nowait_noargs(app string){ ...@@ -128,6 +128,26 @@ func Execcmd_nowait_noargs(app string){
} }
//
//
// PowerShell
//
func PSTest_Connection(host string) (bool,error) {
if host == "" {
return false,Error_Lost_Parameter
}
t,err := exec.Command("powershell","-command","Test-Connection",host,"-quiet").Output()
if err !=nil {
return false,err
}
switch string(t[:len(t)-2]) {
case "True":
return true,nil
default:
return false,nil
}
}
// //
// //
// local // local
...@@ -266,7 +286,7 @@ func Reg_Write_key_one(root int, path, name, value string) { ...@@ -266,7 +286,7 @@ func Reg_Write_key_one(root int, path, name, value string) {
// reg func for domain computer // reg func for domain computer
// //
func Reg_Write_DC(key , value string){ func Reg_Write_DC( key, value string){
Reg_Write_key_one( Reg_Write_key_one(
Reg_Root_dc, Reg_Root_dc,
Reg_Path_home, Reg_Path_home,
...@@ -286,13 +306,25 @@ func Reg_Query_DC(key string) string { ...@@ -286,13 +306,25 @@ func Reg_Query_DC(key string) string {
// reg func for AD // reg func for AD
// //
func Reg_Query_AC_DC(pc ,key string)string { func Reg_Query_ADPC(pc ,key string)string {
return Reg_query_key_one( return Reg_query_key_one(
Reg_Root_ac, Reg_Root_ac,
Reg_Path_home_ac + pc, Reg_Path_home_ac + pc,
key) key)
} }
func Reg_Write_ADDC(pc,key, value string){
Reg_Write_key_one(
Reg_Root_ac,
Reg_Path_home_ac + pc,
key,
value)
}
func Reg_Query_ADUsers(name ,key string)string {
return Reg_query_key_one(
Reg_Root_ac,
Reg_Path_home_du + name,
key)
}
// //
// //
......
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"`
}
type WxSendMsgRec struct {
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"`
}
type WxSendMsgTextContent struct {
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
}
\ No newline at end of file
...@@ -387,7 +387,7 @@ func tUpdateATool(){ ...@@ -387,7 +387,7 @@ func tUpdateATool(){
} }
// 其他工具 移动硬盘(胡一波专用) // 其他工具 移动硬盘(胡一波专用)
func t_movedisk_huyibo(){ func t_movedisk_huyibo(){
pub.SendDaemonExec(`F:\SamsungPortableSSD.exe`) //pub.SendDaemonExec(`F:\SamsungPortableSSD.exe`)
} }
func t_keyboard_xuwenqiang(){ func t_keyboard_xuwenqiang(){
pub.SendServerGUIExec(`start C:\Users\Public\Desktop\Durgod_Zeus_Engine.lnk`) pub.SendServerGUIExec(`start C:\Users\Public\Desktop\Durgod_Zeus_Engine.lnk`)
......
package main
// 获取 同事个人信息的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 wxJsonBricklayerInfoExtattr struct {
Attrs [] wxJsonBricklayerInfoExtattrValue `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 wxJsonBricklayerInfoExtattrValueText struct {
Value string `json:"value"`
}
type wxJsonBricklayerInfoExtattrValueWeb struct {
Url string `json:"url"`
Title string `json:"title"`
}
type wxJsonBricklayerInfoExtattrValueMinProgram struct {
Appid string `json:"appid"`
Pagepath string `json:"pagepath"`
Title string `json:"title"`
}
package main
import (
pub "AD-Control/public"
"net/http"
"encoding/xml"
"log"
"net/url"
"fmt"
"io/ioutil"
"wxbizmsgcrypt"
"time"
"strconv"
)
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"`
}
func main(){
pub.Loger = pub.NewLoger(pub.Dir_AD_log + `wxwork.log`)
pub.PrintLog("Wxwrok Daemon Runing!")
http.HandleFunc("/",index)
log.Println(http.ListenAndServe(pub.WxwrokDaemon, nil))
}
func index(w http.ResponseWriter, r *http.Request){
d := r.URL.RawQuery
if d == "" { return }
byteBody,err := ioutil.ReadAll(r.Body)
if err!=nil{
panic(err)
}
// 开始处理HTML
go readHtmlData(d,&byteBody)
// 立刻返回
fmt.Fprintf(w,"")
}
func readHtmlData(d string,byteBody* []byte) string {
// 建立 企业微信 加密方法
wxcpt := wxbizmsgcrypt.NewWXBizMsgCrypt(pub.WXTokenMsgSend, pub.WxworkEncodingAseKey,pub. WxworkReceiverId, wxbizmsgcrypt.XmlType)
// 解析 地址 参数
// ?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3&timestamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
m,_ := url.ParseQuery(d)
// 验证消息
// res, cryptErr := wxcpt.VerifyURL(m["msg_signature"][0],m["timestamp"][0], m["nonce"][0],m["echostr"][0])
// if nil != cryptErr {
// PrintLog("verifyUrl fail", cryptErr)
// }
// PrintLog("verifyUrl success code:", string(res))
// fmt.Fprintf(w,string(res))
// return
// 解密html
msg, cryptErr := wxcpt.DecryptMsg(
m["msg_signature"][0],
m["timestamp"][0],
m["nonce"][0],
*byteBody)
if nil != cryptErr {
pub.PntError("DecryptMsg fail", cryptErr)
return pub.Error_WXWork_Down_STR
}
// 解析具体消息
wxmsg := ParseXML(&msg)
// 获取 查阅同事的token
wtBricklayer,err := pub.GetWXWorkToken()
if err != nil{
pub.PntError(err)
return pub.Error_WXWork_Down_STR
}
// 查询 姓名
name,err := GetBricklayerName(wtBricklayer,wxmsg.FromUsername)
if err !=nil {
pub.PntError(err)
return pub.Error_WXWork_Down_STR
}
// 具体功能实现
//result := MsgDeal(&name,&wxmsg.FromUsername,&wxmsg.Content)
wxMsgDeal(&name,&wxmsg.FromUsername,&wxmsg.Content)
return ""
// // 建立 回复消息模板
// xml,t,nonce := wxmsg.createXML(result)
// // 加密消息
// cryptMsg, cryptErr := wxcpt.EncryptMsg(xml, t, nonce)
// if nil != cryptErr {
// PntError("DecryptMsg fail", cryptErr)
// return Error_WXWork_Down_STR
// }
// return string(cryptMsg)
}
func wxMsgDeal(name, userid,text * string ) string{
var result []byte
var err error
var wxwork pub.MJwxwork
pub.PrintPrefix("Listen ",*name,*text)
switch *text{
case "芝麻开机":
pub.SendWxworkTextToAUser(*userid,"收到,正在处理~")
result,err = pub.SendServer(pub.GJwxworkText(name,userid,text,pub.Msg_Wxwork_UserWake))
//
default:
pub.SendWxworkTextToAUser(*userid,"emmmmmmmmm")
return ""
}
if err != nil {
return pub.Error_WXWork_Down_STR
}
pub.ParseJsonBody(result,&wxwork)
if err := wxwork.SendTextToAUser();err!=nil{
pub.PntError(err)
}
return ""
}
func (wxmsg * wxXml) createXML(res string) (string,string,string) {
t := time.Now()
nonce := strconv.Itoa(t.Nanosecond())
timestamp := strconv.FormatInt(t.Unix(),10)
wxmsg.Content = res
xml,err := xml.Marshal(&wxmsg)
if err != nil {
pub.PntError(err)
}
return string(xml),timestamp,nonce
}
func ParseXML(unmsg *[]byte)wxXml{
var msg wxXml
if nil != xml.Unmarshal(*unmsg, &msg) {
pub.PntError("Unmarshal fail")
}
return msg
}
// 读取企业通讯录的成员信息
//官方说明:
// https://work.weixin.qq.com/api/doc/90000/90135/90196
func GetBricklayerName(token, userid string) (string,error) {
link := pub.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s",token,userid)
data,err := pub.SendGetRequest(&link)
if err !=nil {
pub.PntError(err)
return "",pub.Error_WXWork_Down
}
var bi wxJsonBricklayerInfo
pub.ParseJsonBody(data,&bi)
if bi.Errcode !=0 {
pub.PntError(bi.Errmsg)
return "",pub.Error_WXWork_Down
}
return bi.Name,nil
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment