Commit 46ab9836 by 陶腾飞

update

parent 42060ed5
......@@ -8,13 +8,17 @@ import (
func main(){
var logpath string
if pub.Adserver() {
logpath = `F:\logs\`
logpath = pub.Dir_AD_log
} else {
logpath = pub.Dir_userprofile
if pub.RunAsPC(pub.User_computername){
logpath = `C:\windows\system32\`
}else{
logpath = pub.Dir_userprofile + `\`
}
//pub.AutoFillInWeDriveDir()
}
pub.Loger = pub.NewLoger(logpath + `\adct.log`)
pub.Loger = pub.NewLoger(logpath + `adct.log`)
//pub.PrintLog("start adct")
var backupText = flag.String( pub.Msg_Backup ,"" ,"backup status to AD")
......@@ -118,7 +122,7 @@ func flag_wolall(pass * string){
continue
}else{
if limit <= 10 {
pub.Delay(60)
pub.Delay(10)
limit=0
}
pub.PrintLog(i,pc,mac)
......
......@@ -3,47 +3,21 @@ package main
import (
pub "AD-Control/public"
"net"
"io"
"bufio"
)
// 守护进程 初始化
func daemonInit(){
// 1 创建文件夹
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`
} else {
// 日志文件位置:域计算机的备份目录:C:\windows\temp
logpath = pub.Dir_tmp + `\daemon.log`
}
if !pub.Adserver(){pub.Exit()}
//3 写入日志
pub.Loger = pub.NewLoger(logpath)
// 写入日志
pub.Loger = pub.NewLoger(pub.Dir_AD_log + `daemon.log`)
}
// 守护进程 运行
func deamonRun(){
daemonHost := pub.User_computername
listener, err := net.Listen("tcp", pub.DaemonListen)
listener, err := net.Listen("tcp",pub.DaemonListen)
if err != nil {
pub.PntError("Listen Error ", err)
return
......@@ -53,29 +27,27 @@ func deamonRun(){
for{
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 := pub.GetConnIP(conn.RemoteAddr())
// 获取消息类型
msgtype := pub.ParseJsonHead(bmsg)
msgtype := pub.GetMsgType(bmsg[0:30])
// 处理消息
rec := pub.DealMsgEnter(ip,msgtype,bmsg)
// 写入连接
conn.Write(rec)
}else{
pub.PntError(daemonHost," Conn Read Error ", cerr)
}
// 关闭连接
if err := conn.Close() ; err!= nil{
pub.PntInfo(err)
}
continue
}else{
pub.PntError(daemonHost," Listen Error ", err)
pub.PntError(" Listen Error", err)
}
}
......@@ -85,4 +57,3 @@ func main() {
daemonInit()
deamonRun()
}
\ No newline at end of file
package public
// AD-Control //
const Host_adserver string = "ADSERVER"
const DaemonPort string = "16823"
const DaemonPort string = "16824"
const DaemonListen string = ":" + DaemonPort
const ADServerDaemon string = Host_adserver + DaemonListen
var LocalDaemon string = User_computername + DaemonListen
const WxwrokDaemon string = ":16823"
const RandMax int = 60
const Version string = "1.2.0"
const Version string = "1.3.0"
// user //
......@@ -45,13 +44,14 @@ var Dir_appdata string = GetEnv("appdata")
var Dir_tmp string = GetEnv("tmp")
var Dir_Windows string = GetEnv("windir") + `\`
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 = "办公室部门内部共享"
var Dir_dept_share_full string = Reg_Value_WeDriveDir + `\` + Dir_dept_share
const Dir_DCSave string = `D:\DomainUserBackupV2`
var Dir_WeDrive = [2] string {Dir_appdata + `\Tencent\WXWork\Data`,Dir_userprofile + `\Documents\WXWork`}
var Dir_Be = []string {Dir_DocuBase}
var Dir_Sync_Config string = Dir_appdata + `\Sync App Settings\_SYNCAPP\`
var Dir_AD_log string = `H:\logs\`
// Local File //
......@@ -73,7 +73,7 @@ const App_Sync_dir string = `C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe
// backup //
var Bak_Version string = "0709"
var Bak_Version string = "0710"
// reg info //
......@@ -87,6 +87,7 @@ const Reg_Root_ac int = HKLM
const Reg_Root_dc int = HKCU
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_du string = Reg_Path_home + `\DomainUsers\` // use for adserver,not for dc
const Reg_Name_TurnOnTime string = "TurnOnTime"
const Reg_Name_TurnOffTime string = "TurnOffTime"
const Reg_Name_LoginUserName string = "loginUser"
......@@ -95,16 +96,18 @@ const Reg_Name_LogOffTime string = "LogOffTime"
const Reg_Name_BackupOverTime string = "BackupOverTime"
const Reg_Name_WeDriveDir string = "WeDriveDir"
const Reg_Name_MACaddress string = "MACaddress"
const Reg_Name_MACAddress string = "MACAddress"
const Reg_Name_PrimaryUser string = "PrimaryUser"
const Reg_Name_PowerStatus string = "PowerStatus"
const Reg_Name_LogStatus string = "LogStatus"
const Reg_Name_BackupVersion string = "BackupVersion"
const Reg_Name_PrimayComputerName string = "PrimayComputerName"
const Reg_Name_BeWakedID string = "BeWakedID"
// reg value //
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_PowerStatus_OFF string = "OFF"
var Reg_Value_ON string = "ON"
var Reg_Value_OFF string = "OFF"
var Reg_Value_LogStatus_IN string = "IN"
var Reg_Value_LogStatus_OUT string = "OUT"
......@@ -116,3 +119,14 @@ const Cmd_k string = "cmd /k "
const Cmd_K_Start string = "cmd /k start "
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
import (
"errors"
)
var Error_NullCommand = errors.New("NULL COMMAND ")
var Error_NullRegQuery = errors.New("Null Reg Query")
var Error_Lost_Parameter = errors.New("Lost Paramter")
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_App_Sync = errors.New("Not Find Application AllWay Sync")
var Error_Null_File = errors.New("Not Find File")
var Error_Null_Folder = errors.New("Not File Folder")
var Error_Null_Icon_File = errors.New("Not File Icon File")
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_TCP_STR = "ERROR"
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
//
func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
var ret interface{}
switch msgtype{
// 报告 消息
......@@ -43,12 +44,17 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
return nil
case Msg_Wxwork:
var pmsg MJwxwork
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
}
return JsonToByte(&ret)
}
//
//
// 具体消息实现
......@@ -93,46 +99,55 @@ func (rep *MJreport)Msg_Deal() interface{} {
return GJbackup()
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)
SysMsgBox(rep.Computername,`备份完成,即将关机,如需取消关机,运行Z:\tools\【工具】取消关机.bat或在小工具-电源管理-取消自动关机`)
return GJexecAck(Msg_Exec_TurnOffPC)
case Msg_Report_WillTurnOffPC:
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_TurnOffTime,
UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_PowerStatus,
Reg_Value_PowerStatus_OFF)
Reg_Value_OFF)
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,
UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC(
//记录 电源状态
rep.Reg_Write_ADDC(
Reg_Name_PowerStatus,
Reg_Value_PowerStatus_ON)
Reg_Value_ON)
case Msg_Report_WillLogInUser:
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LoginUserName,
rep.Username)
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LoginTime,
UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LogStatus,
Reg_Value_LogStatus_IN)
case Msg_Report_WillLogOutUser:
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LoginUserName,
rep.Username)
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LogOffTime,
UnixTimeParse(&rep.Timestamp))
rep.Reg_Write_AC(
rep.Reg_Write_ADDC(
Reg_Name_LogStatus,
Reg_Value_LogStatus_OUT)
......@@ -330,3 +345,47 @@ func (err * MJerror)Msg_Deal() interface{}{
//SendWX(err.Instruction)
return nil
}
// 关于 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
//
//
// msg env ////////////////////////////////////////////////////////////////
//
const EndSign byte = 125
const msgerror string = "error"
// msg type ////////////////////////////////////////////////////////////////
const Msg_Report string = "report"
......@@ -16,9 +15,12 @@ const Msg_Exec string = "exec"
const Msg_Backup string = "backup"
const Msg_Reg string = "reg"
const Msg_Error string = "error"
const Msg_Wxwork string = "wxwork"
// base word ////////////////////////////////////////////////////////////////
const LogInUser string = "LogInUser"
const LogOutUser string = "LogOutUser"
const WillLogInUser string = "WillLogInUser"
......@@ -28,6 +30,9 @@ const TurnOffPC string = "TurnOffPC"
const WillTurnOnPC string = "WillTurnOnPC"
const WillTurnOffPC string = "WillTurnOffPC"
// msg report type ///////////////////////////////////////////////////////////
const Msg_Report_LoginInUser string = LogInUser
......@@ -44,12 +49,16 @@ const Msg_Report_StartBak string = "startbak"
const Msg_Report_OverBak string = "stopbak"
const Msg_Report_DCInfo string = "DCInfo"
// msg backup type //////////////////////////////////////////////////////////////
const Msg_Backup_Status_Start string = "start"
const Msg_Backup_Status_Continue string = "Continue"
const Msg_Backup_Status_Run string = "run"
// msg exec type ////////////////////////////////////////////////////////////////
const (
......@@ -73,7 +82,7 @@ const Msg_Exec_CopyWeDrive string = "copyWeDrive"
const Msg_Exec_CopyDeptShare string = "copydeptshare"
const Msg_Exec_GUIExec string = "guiexec"
const Msg_Wxwork_UserWake string = "UserWake"
//
const (
Msg_Reg_Query = iota
......@@ -131,6 +140,15 @@ type MJreg struct{
type MJerror struct{
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{
//
// Report
func GJreport(s string) interface{}{
......@@ -153,14 +172,14 @@ func GJreport_DCInfo(s string) interface{}{
rep.Explain = s
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_Root_ac,
Reg_Path_home_ac + rep.Computername,
key,
value)
}
func (rep * MJreport)Reg_Query_AC(key string) string{
func (rep * MJreport)Reg_Query_ADDC(key string) string{
return Reg_query_key_one(
Reg_Root_ac,
Reg_Path_home_ac + rep.Computername,
......@@ -233,10 +252,10 @@ func (exec * MJexec)init(s string){
exec.SessionID = User_sessionID
exec.Cmder = Msg_Exec_Cmder_LocalDaemon
exec.Status = Msg_Exec_State_Request
exec.Timestamp = NowTimestamp()
}
// Backup
func GJbackup()interface{}{
......@@ -252,6 +271,7 @@ func (bak * MJbackup)init() {
}
// error
func GJerror(e error)interface{}{
......@@ -267,3 +287,25 @@ func (err * MJerror)init (e error){
err.MsgType = Msg_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
import (
"log"
"os"
"fmt"
)
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{}){
log.SetPrefix("Output ")
log.Println(v ...)
......@@ -60,13 +81,25 @@ func PntSend(v ...interface{}){
Loger.SetPrefix("Send ")
Loger.Println(v ...)
}
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 PrintPrefix(s string ,v ...interface{}){
Loger.SetPrefix(s)
PrintLog(v ...)
Loger.Println(v ...)
}
func PntWxwork(v ...interface{}){
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 (
// 获取 环境变量
// 如果空 输出错误
// 获取 消息内容
func ParseJsonHead(b []byte)string{
//{"msgtype":"report","msgstate":"","username":"zhiweiadserver","computername":"ADSERVER","report":"下班"}
// 获取 消息类型
func GetMsgType(b []byte)string{
//{"msgtype":"report","...":"..."}
// 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容
msgtype := b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1]
return string(msgtype)
return string(b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1])
}
// 解析Json 并放到变量中
func ParseJsonBody(unmsg []byte,v interface{}){
// 填写
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) {
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 (
"encoding/json"
"net"
"net/http"
"io"
"io/ioutil"
"bytes"
"bufio"
"io"
"fmt"
)
func SendDaemon(v interface{})[]byte{
return SendMsg(LocalDaemon,v)
}
func SendDaemonExec(s string){
SendDaemon(GJexecUserCmd(s))
}
func SendServerReport(s string)[]byte{
func SendServerReport(s string)([]byte,error){
return SendServer(GJreport(s))
}
func SendServerDCInfo(s string)[]byte{
func SendServerDCInfo(s string)([]byte,error){
return SendServer(GJreport_DCInfo(s))
}
func SendServerExec(s string)[]byte{
func SendServerExec(s string)([]byte,error){
return SendServer(GJexec(s))
}
func SendServerGUIExec(s string){
SendServer(GJexecGUI(s))
}
func SendServerError(err error)[]byte{
func SendServerError(err error)([]byte,error){
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 ...)))
}
// send to server
func SendServer(v interface{})[]byte{
if Adserver() {return nil}
func SendServer(v interface{}) ([]byte,error){
//if Adserver() {return nil}
return SendMsg(ADServerDaemon,v)
}
// base
func SendMsg(you string ,v interface{})[]byte{
func SendMsg(you string ,v interface{}) ([]byte,error){
textbyte,err := json.Marshal(v)
if err !=nil {
PntError("Json to String Error ",v,err)
return nil,err
}
conn, err := net.Dial("tcp", you)
if err != nil {
PntError("err = ", err)
return nil,err
}
defer conn.Close()
PntSend(string(textbyte))
//发送数据
conn.Write(textbyte)
PntSend(string(textbyte))
bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign)
var rec []byte
if cerr != io.EOF {
if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign);cerr == nil || cerr == io.EOF{
// 获取ip
ip := GetConnIP(conn.RemoteAddr())
// 获取消息类型
msgtype := ParseJsonHead(bmsg)
msgtype := GetMsgType(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){
......@@ -91,3 +117,35 @@ func SendWX(Content string){
}`)
http.Post(Link_WxworkBot,"application/json; charset=utf-8",bytes.NewBuffer(w))
}
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{
func execcmd_base(cmdargs string) (string,[]string,error){
if cmdargs == "" {
return "",nil,Error_NullCommand
return "",nil,Error_Null_Command
}
var 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
......@@ -266,7 +286,7 @@ func Reg_Write_key_one(root int, path, name, value string) {
// reg func for domain computer
//
func Reg_Write_DC(key , value string){
func Reg_Write_DC( key, value string){
Reg_Write_key_one(
Reg_Root_dc,
Reg_Path_home,
......@@ -286,13 +306,25 @@ func Reg_Query_DC(key string) string {
// 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(
Reg_Root_ac,
Reg_Path_home_ac + pc,
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(){
}
// 其他工具 移动硬盘(胡一波专用)
func t_movedisk_huyibo(){
pub.SendDaemonExec(`F:\SamsungPortableSSD.exe`)
//pub.SendDaemonExec(`F:\SamsungPortableSSD.exe`)
}
func t_keyboard_xuwenqiang(){
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