Commit 82a20f47 by 陶腾飞

update

parent d408f767
File added
package public package main
import ( import (
"AD-Control/public"
"flag" "flag"
) )
func FlagInit()bool{
var reportText = flag.String(Msg_Report,"","report to AD")
var backupText = flag.String(Msg_Backup,"","backup status to AD")
var execText = flag.String(Msg_Exec,"","exec to LocalDaemon")
flag.Parse()
if *reportText != "" {flag_report(reportText);return true}
if *backupText != "" {flag_bakcup(backupText);return true}
if *execText != "" {flag_exec(execText);return true}
return false func main(){
var reportText = flag.String(public.Msg_Report,"","report to AD")
var backupText = flag.String(public.Msg_Backup,"","backup status to AD")
var execText = flag.String(public.Msg_Exec,"","exec to LocalDaemon")
var userText = flag.String(public.Msg_User,"","who is running me")
flag.Parse()
if *reportText != "" {flag_report(reportText,userText)}
if *backupText != "" {flag_bakcup(backupText)}
if *execText != "" {flag_exec(execText)}
return
} }
func flag_report(s *string){ func flag_report(s *string,who * string){
SendServerReport(*s) public.SendServer(public.GJreport(*s,*who))
} }
func flag_bakcup(s *string){ func flag_bakcup(s *string){
; ;
......
No preview for this file type
...@@ -6,6 +6,7 @@ import ( ...@@ -6,6 +6,7 @@ import (
"net" "net"
"io" "io"
"bufio" "bufio"
//"os/exec"
) )
//--------------------- //---------------------
// //
...@@ -13,15 +14,18 @@ import ( ...@@ -13,15 +14,18 @@ import (
// //
//--------------------- //---------------------
func daemonInit(){ func daemonInit(){
if !public.Exists(public.DocuBase){ if public.NotExist(public.DocuBase){
public.PrintLog("init: create Documents Base -> ",public.DocuBase) public.PrintLog("init: create Documents Base -> ",public.DocuBase)
public.Mkdir(public.DocuBase) public.Mkdir(public.DocuBase)
} }
public.PrintLog(public.Env_computername," Daemon start") public.PrintLog(public.Msg_Report_DaemonStart)
if notadserver() { if notadserver() {
public.SendServerExec(public.Version)
public.SendServerReport(public.Env_computername + " Daemon start") // 检查版本
public.SendServerReport(public.Msg_UpdateVersion)
// 发送Daemon Start
public.SendServerReport(public.Msg_Report_DaemonStart)
} }
} }
...@@ -35,12 +39,12 @@ func deamonRun(){ ...@@ -35,12 +39,12 @@ func deamonRun(){
defer listener.Close() defer listener.Close()
for{ for{
public.DebugLog(daemonHost," Conn Listen") //public.PrintLog(daemonHost," Conn Listen")
if conn, err := listener.Accept(); err == nil { if conn, err := listener.Accept(); err == nil {
// 新建 读取流 // 新建 读取流
if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(public.EndSign) ; cerr != io.EOF { if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(public.EndSign) ; cerr != io.EOF {
// 测试消息流 // 测试消息流
public.DebugLog(string(bmsg)) //public.PrintLog(string(bmsg))
// 获取ip // 获取ip
ip := public.GetConnIP(conn.RemoteAddr()) ip := public.GetConnIP(conn.RemoteAddr())
...@@ -72,7 +76,7 @@ func deamonRun(){ ...@@ -72,7 +76,7 @@ func deamonRun(){
func main() { func main() {
//if public.Daemon {return}
daemonInit() daemonInit()
deamonRun() deamonRun()
......
ad-control-daemon
...@@ -10,6 +10,7 @@ var LocalDaemon string = Env_computername + DaemonListen ...@@ -10,6 +10,7 @@ var LocalDaemon string = Env_computername + DaemonListen
const DocuBase string = `C:\Users\Public\Documents\AD-Control\` const DocuBase string = `C:\Users\Public\Documents\AD-Control\`
const RandMax int = 60 const RandMax int = 60
const Version string = "0.5.1" const Version string = "0.5.1"
const Application string = "AD-Control-Log"
// user env /////////////////////////////////////////////////////////////// // user env ///////////////////////////////////////////////////////////////
...@@ -47,9 +48,9 @@ const Env_ADSoftTool_Update string = Env_ADApplication + "update.bat" ...@@ -47,9 +48,9 @@ const Env_ADSoftTool_Update string = Env_ADApplication + "update.bat"
// backup env ////////////////////////////////////////////////////////////// // backup env //////////////////////////////////////////////////////////////
var BackupVersion string = "0419" var BackupVersion string = "0428"
var BackupExtFile string = ".ffs_batch" var BackupExtFile string = ".ffs_batch"
var BackupReplaceKey =[]byte("tengfei") var BackupReplaceKey =[]byte("-tengfei-")
...@@ -78,20 +79,22 @@ const msgerror string = "error" ...@@ -78,20 +79,22 @@ const msgerror string = "error"
const Msg_Report string = "report" const Msg_Report string = "report"
const Msg_Exec string = "exec" const Msg_Exec string = "exec"
const Msg_Backup string = "backup" const Msg_Backup string = "backup"
const Msg_User string = "user"
// msg report type /////////////////////////////////////////////////////////// // msg report type ///////////////////////////////////////////////////////////
const Msg_Report_DaemonStart string = "Daemon Start"
const Msg_Report_UserStart string = "User Start"
const Msg_Report_Offwork string = "offwork" const Msg_Report_Offwork string = "offwork"
const Msg_Report_OverBak string = "overbak" const Msg_Report_OverBak string = "overbak"
// msg backup status ////////////////////////////////////////////////////////////// // msg backup status //////////////////////////////////////////////////////////////
const Msg_Backup_Status_Start string = "start" const Msg_Backup_Status_Start string = "start"
const Msg_Backup_Status_RFile string = "rfile"
const Msg_Backup_Status_If string = "if" const Msg_Backup_Status_If string = "if"
const Msg_Backup_Status_RunBak string = "runbak" const Msg_Backup_Status_Continue string = "Continue"
const Msg_Backup_Status_Run string = "run"
//const Msg_Backup_Status_Over string = "over" //const Msg_Backup_Status_Over string = "over"
...@@ -111,26 +114,28 @@ const Msg_Exec_LogOffUser_cmd string = "shutdown -l" ...@@ -111,26 +114,28 @@ const Msg_Exec_LogOffUser_cmd string = "shutdown -l"
const Msg_Exec_UserExec string = "userexec" const Msg_Exec_UserExec string = "userexec"
const Msg_Exec_RebootWindows string = "rebootWindows" const Msg_Exec_RebootWindows string = "rebootWindows"
const Msg_Exec_RebootWindows_cmd string = "shutdown -r -t 15" const Msg_Exec_RebootWindows_cmd string = "shutdown -r -t 15"
const Msg_Exec_Update string = "update"
const Msg_Exec_Update_cmd string = Env_ADSoftTool_Update
// group msg ////
const Msg_UpdateVersion string = "updateverion"
const Msg_UpdateVersion_cmd string = Env_ADSoftTool_Update
// Basic Json Fromat /////////////////////////////////////////////////////// // Basic Json Fromat ///////////////////////////////////////////////////////
type MJbase struct{ type MJbase struct{
MsgType string `json:"msgtype"` MsgType string `json:"msgtype"`
//MsgStatus string `json:"msgstatus"`
Username string `json:"username"`
Computername string `json:"computername"`
Status string `json:"status"` Status string `json:"status"`
Explain string `json:"explain"` Explain string `json:"explain"`
Version string `json:"version"` Username string `json:"username"`
Computername string `json:"computername"`
} }
// report Json Format ////////////////////////////////////////////////////// // report Json Format //////////////////////////////////////////////////////
type MJreport struct { type MJreport struct {
MJbase MJbase
Report string `json:"report"` Report string `json:"report"`
Version string `json:"version"`
} }
// Exec Json Fromat /////////////////////////////////////////////////////// // Exec Json Fromat ///////////////////////////////////////////////////////
...@@ -152,3 +157,10 @@ type MJbackup struct{ ...@@ -152,3 +157,10 @@ type MJbackup struct{
BatchFileData []byte `json:"batchfiledata"` BatchFileData []byte `json:"batchfiledata"`
BatchFileName string `json:"batchfilename"` BatchFileName string `json:"batchfilename"`
} }
// AD User ////////////////////////////////////////////////////////////////
const AD_User_main_admin string = "zhiweiadserver"
const AD_User_tengfei string = "tengfei"
const AD_User_taotengfei string = "taotengfei"
const AD_User_huyibo string = "huyibo"
\ No newline at end of file
package public package public
//
// 消息入口 // 消息入口
//
func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte { func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
PrintLog("DEAL ",string(unmsg))
var ret interface{} var ret interface{}
switch msgtype{ switch msgtype{
// 报告 消息 // 报告 消息
...@@ -32,16 +37,19 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte { ...@@ -32,16 +37,19 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
func (rep *MJreport)Msg_Deal() interface{} { func (rep *MJreport)Msg_Deal() interface{} {
PrintLog(rep.Explain)
switch rep.Report{ switch rep.Report{
case Msg_Report_Offwork: case Msg_Report_Offwork:
if IfPrimaryUser(rep.Username){ return GJbackup()
return GJbackup(Msg_Backup_Status_Start)
}
return nil
case Msg_Report_OverBak: case Msg_Report_OverBak:
SysMsgBox(rep.Computername,"备份结束")
return GJexecAck(Msg_Exec_CloseWindows) return GJexecAck(Msg_Exec_CloseWindows)
case Msg_UpdateVersion:
if rep.Version == Version{
return nil
} else{
return GJexecAck(Msg_UpdateVersion)
}
default: default:
PrintLog("Default Report Json ",rep.Report) PrintLog("Default Report Json ",rep.Report)
...@@ -51,15 +59,6 @@ func (rep *MJreport)Msg_Deal() interface{} { ...@@ -51,15 +59,6 @@ func (rep *MJreport)Msg_Deal() interface{} {
} }
func (exec *MJexec)Msg_Deal()interface{}{ func (exec *MJexec)Msg_Deal()interface{}{
switch exec.Status{
case Msg_Exec_State_Request:
// maybe 当然时我来控制咯
// 修改 请求状态,client daemon才可以执行
exec.Status = Msg_Exec_State_Ack
// 根据指令类型
// 确定具体命令
// 以及是否延迟
switch exec.Instruction{ switch exec.Instruction{
case Msg_Exec_CloseWindows: case Msg_Exec_CloseWindows:
exec.Command = Msg_Exec_CloseWindows_cmd exec.Command = Msg_Exec_CloseWindows_cmd
...@@ -75,20 +74,16 @@ func (exec *MJexec)Msg_Deal()interface{}{ ...@@ -75,20 +74,16 @@ func (exec *MJexec)Msg_Deal()interface{}{
case Msg_Exec_RebootWindows: case Msg_Exec_RebootWindows:
exec.Command = Msg_Exec_RebootWindows_cmd exec.Command = Msg_Exec_RebootWindows_cmd
exec.IfDelay = false exec.IfDelay = false
case Msg_Exec_Update:
exec.Explain = Version
exec.Command = Msg_Exec_Update_cmd
exec.IfDelay = false
} }
switch exec.Status{
case Msg_Exec_State_Request:
// maybe 当然时我来控制咯
// 修改 请求状态,client daemon才可以执行
exec.Status = Msg_Exec_State_Ack
return exec return exec
case Msg_Exec_State_Ack: case Msg_Exec_State_Ack:
// maybe 利用协程,单独启动
switch exec.Instruction{
case Msg_Exec_Update:
if exec.Explain == Version{ return nil}
case Msg_Exec_CancelCloseWindows:
exec.Command = Msg_Exec_CancelCloseWindows_cmd
}
if exec.IfDelay {Delay(&exec.Delay)} if exec.IfDelay {Delay(&exec.Delay)}
Execcmd_nowait(exec.Command) Execcmd_nowait(exec.Command)
...@@ -96,8 +91,12 @@ func (exec *MJexec)Msg_Deal()interface{}{ ...@@ -96,8 +91,12 @@ func (exec *MJexec)Msg_Deal()interface{}{
return nil return nil
} }
func (bak * MJbackup)Msg_Deal() interface{}{ func (bak * MJbackup)Msg_Deal() interface{}{
switch bak.Status{ switch bak.Status{
case Msg_Backup_Status_Start: case Msg_Backup_Status_Start:
if !PrimaryUser(bak.Username) { return nil }
bak.Username = Env_username bak.Username = Env_username
bak.Computername = Env_computername bak.Computername = Env_computername
bak.Explain = "Backup Start" bak.Explain = "Backup Start"
...@@ -108,62 +107,62 @@ func (bak * MJbackup)Msg_Deal() interface{}{ ...@@ -108,62 +107,62 @@ func (bak * MJbackup)Msg_Deal() interface{}{
//PrintLog("收集D盘剩余空间,查询主用户") //PrintLog("收集D盘剩余空间,查询主用户")
PrintLog(bak.Explain) PrintLog(bak.Explain)
//如果Start可以,并且得到了主用户,判断是否有最新版本的文件和文件是否存在 //如果Start可以,并且得到了主用户
if !Exists(Env_FreeFileSyncExe){
//判断是否有最新版本的文件是否存在
if NotExist(Env_FreeFileSyncExe){
bak.Errorf("FreeFileSync hasn't been installed") bak.Errorf("FreeFileSync hasn't been installed")
DebugLog(bak.Explain) PrintLog(bak.Explain)
SendServer(bak) SendServer(bak)
return nil return nil
} }
//判断是否有最新版本的文件是否存在
//C:\Users\Public\Documents\AD-Control\0416tengfei.ffs_batch //C:\Users\Public\Documents\AD-Control\0416tengfei.ffs_batch
if !Exists(bak.BatchFileName){ if NotExist(bak.BatchFileName){
bak.BatchFileExist = false
}else{
bak.BatchFileExist = true bak.BatchFileExist = true
}else{
bak.BatchFileExist = false
} }
SendServer(bak) SendServer(bak)
return nil return nil
case Msg_Backup_Status_RFile:
bak.Status = Msg_Backup_Status_If
bak.Explain = "Backup Read Batch File"
PrintLog(bak.Explain)
return bak
// 判断是否能进行备份 // 判断是否能进行备份
case Msg_Backup_Status_If: case Msg_Backup_Status_If:
// 如果ffs的配置文件不存在 或者 是旧版本 // 如果ffs的配置文件不存在 或者 是旧版本
// 读取新文件
if !bak.BatchFileExist || bak.Version != BackupVersion{ if !bak.BatchFileExist || bak.Version != BackupVersion{
bak.BatchFileData = CreateExtTempate(&bak.Username) bak.BatchFileData = CreateExtTempate(&bak.Username)
bak.Version = BackupVersion bak.Version = BackupVersion
} }
bak.Explain = "Backup Fill In BatchFile"
bak.Status = Msg_Backup_Status_RunBak bak.PrintExplain()
bak.Explain = "Backup Runing" bak.Status = Msg_Backup_Status_Continue
PrintLog(bak.Explain)
// 交给daemon 处理 Msg_Backup_Status_Continue
SendMsg(bak.Computername + DaemonListen,bak) SendMsg(bak.Computername + DaemonListen,bak)
return nil
case Msg_Backup_Status_RunBak: case Msg_Backup_Status_Continue:
// 有新版本的话,下行赋值才有意义 // 生成新FFS所使用的batch文件
bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile
if !bak.BatchFileExist{ if !bak.BatchFileExist{
PrintLog("init ",string(bak.BatchFileName))
if err := WriteBytesFile(bak.BatchFileName,bak.BatchFileData);err !=nil{ if err := WriteBytesFile(bak.BatchFileName,bak.BatchFileData);err !=nil{
bak.Errorf("Write Batch File Error "+err.Error()) bak.Errorf("Write Batch File Error "+err.Error())
return nil return bak
} }
} }
bak.Explain = "Backup Runing" bak.Status = Msg_Backup_Status_Run
PrintLog(bak.Explain) bak.Explain = "Backup Ready"
Execcmd_nowait(Env_FreeFileSyncExe + " "+ bak.BatchFileName) bak.PrintExplain()
return nil return bak
case Msg_Backup_Status_Run:
SysMsgBox(bak.Computername,bak.Username + " 开始备份")
PsExecRemote_sd(bak.Computername,Env_FreeFileSyncExe + " "+ bak.BatchFileName)
case Msg_Backup_Status_Error: case Msg_Backup_Status_Error:
PrintLog(bak.Explain) PrintLog(bak.Explain)
return nil
default: default:
PrintLog("Default Backup Json ",bak.Status) PrintLog("Default Backup Json ",bak.Status)
} }
...@@ -171,24 +170,34 @@ func (bak * MJbackup)Msg_Deal() interface{}{ ...@@ -171,24 +170,34 @@ func (bak * MJbackup)Msg_Deal() interface{}{
} }
// //
// quickly Get & Set Json // quickly Get & Set Json
// //
// Report // Report
func GJreport(s string) interface{}{ func GJreport(s string,who string) interface{}{
var rep MJreport var rep MJreport
rep.init(s) rep.init(s)
if who != "" { rep.Username = who }
return rep return rep
} }
func (rep * MJreport)init(Report string) { func (rep * MJreport)init(Report string) {
rep.Username = Env_username
rep.Username = Env_username rep.Username = Env_username
rep.Computername = Env_computername rep.Computername = Env_computername
rep.MsgType = Msg_Report rep.MsgType = Msg_Report
rep.Report = Report rep.Report = Report
rep.Version = Version rep.Version = Version
} }
func (rep * MJreport)PrintExplain(){
PrintLog(rep.Computername,rep.Username,rep.Explain)
}
// Exec // Exec
...@@ -220,26 +229,26 @@ func (exec * MJexec)init(s string){ ...@@ -220,26 +229,26 @@ func (exec * MJexec)init(s string){
exec.Status = Msg_Exec_State_Request exec.Status = Msg_Exec_State_Request
exec.IfDelay = false exec.IfDelay = false
exec.Delay = Rand(RandMax) exec.Delay = Rand(RandMax)
exec.Version = Version
} }
// Backup // Backup
func GJbackup(s string)interface{}{ func GJbackup()interface{}{
var rep MJbackup var rep MJbackup
rep.init(s) rep.init()
return rep return rep
} }
func (bak * MJbackup)init(Status string) { func (bak * MJbackup)init() {
bak.Username = Env_username
bak.Computername = Env_computername
bak.MsgType = Msg_Backup bak.MsgType = Msg_Backup
bak.Version = BackupVersion bak.Version = BackupVersion
bak.Status = Status bak.Status = Msg_Backup_Status_Start
bak.Version = Version bak.Version = Version
} }
func (bak * MJbackup)Errorf(s string){ func (bak * MJbackup)Errorf(s string){
bak.Status = Msg_Backup_Status_Error bak.Status = Msg_Backup_Status_Error
bak.Explain = "Backup Error: " + bak.Computername + " -> " + s bak.Explain = "Backup Error: " + bak.Computername + " -> " + s
} }
func (bak * MJbackup)PrintExplain(){
PrintLog(bak.Username,bak.Status,bak.Explain)
}
\ No newline at end of file
package public package public
import ( import (
"log" "log"
"fmt" //"os"
) )
func PrintLog(v ...interface{}){ func PrintLog(v ...interface{}){
if Debug {
log.SetPrefix("DEBUG ")
log.Println(v ...) log.Println(v ...)
} else {
log.Println(v ...)
}
// logFile, err := os.OpenFile(`C:\` + Application + ".txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
// if nil != err {
// log.Println(err)
// }
// loger := log.New(logFile, "", log.LstdFlags)
// if Debug {
// loger.SetPrefix("DEBUG ")
// }
// loger.Println(v ...)
// logFile.Close()
} }
func DebugLog(v ...interface{}){ // func PrintList(v ...*string){
if Debug {fmt.Print("DEBUGING ");log.Println(v ...)} // var b []byte
} // for _,i := range v{
\ No newline at end of file // append(b,v)
// }
// }
\ No newline at end of file
...@@ -19,7 +19,7 @@ import ( ...@@ -19,7 +19,7 @@ import (
// 但不退出 // 但不退出
func GetEnv(e string) string{ func GetEnv(e string) string{
r := os.Getenv(e) r := os.Getenv(e)
DebugLog(e,"->",r) PrintLog(e,"->",r)
// 获取为空 // 获取为空
if r == "" { if r == "" {
PrintLog("环境错误!") PrintLog("环境错误!")
...@@ -70,16 +70,15 @@ func JsonToByte(v interface{}) []byte{ ...@@ -70,16 +70,15 @@ func JsonToByte(v interface{}) []byte{
return textbyte return textbyte
} }
// 是否存在 // 存在文件
func Exists(path string) bool { func Exist(path string) bool {
_, err := os.Stat(path) //os.Stat获取文件信息 _, err := os.Stat(path) //os.Stat获取文件信息
if err != nil { return os.IsExist(err)
if os.IsExist(err) { }
return true // 不存在文件
} func NotExist(path string) bool {
return false _, err := os.Stat(path) //os.Stat获取文件信息
} return os.IsNotExist(err)
return true
} }
// 是否为文件夹 // 是否为文件夹
func IsDir(path string) bool { func IsDir(path string) bool {
...@@ -127,22 +126,44 @@ func CreateExtTempate(dist*string) []byte { ...@@ -127,22 +126,44 @@ func CreateExtTempate(dist*string) []byte {
func GetConnIP(s net.Addr) string { func GetConnIP(s net.Addr) string {
return strings.Split(s.String(),":")[0] return strings.Split(s.String(),":")[0]
} }
func IfPrimaryUser(s string) bool{ //
func PrimaryUser(s string) bool{
if strings.Index(s,"zhiwei") == -1{ if strings.Index(s,"zhiwei") == -1{
return true return true
} }
return false return false
} }
// 随机
func Rand(i int)string{ func Rand(i int)string{
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
return strconv.Itoa(rand.Intn(i)) return strconv.Itoa(rand.Intn(i))
} }
func Delay(s * string){ func Delay(s * string){
DebugLog("延迟",*s,"秒") PrintLog("延迟",*s,"秒")
i,_ := strconv.Atoi(*s) i,_ := strconv.Atoi(*s)
time.Sleep(time.Duration(i) * time.Second) time.Sleep(time.Duration(i) * time.Second)
} }
func TheUser(s * string)bool{ func AdminUser( )bool{
if *s == Env_fqdn_cn || *s == "taotengfei" || *s == "tengfei" || *s == "zhiweiadserver" {return true} switch Env_username{
case AD_User_taotengfei:
return true
case AD_User_tengfei:
return true
case AD_User_main_admin:
return true
}
return false return false
} }
func TheUser(s string)bool{
if s == Env_username || AdminUser() { return true}
return false
}
func ReadDir(s string) ([]os.FileInfo,error){
f,err := ioutil.ReadDir(s)
return f,err
}
// func ReadDirModTime(s string) ([]string,error) {
// f,err := ioutil.ReadDir(s)
// var v []byte
// append()v
// }
\ No newline at end of file
...@@ -7,24 +7,29 @@ import ( ...@@ -7,24 +7,29 @@ import (
"io" "io"
"bytes" "bytes"
"bufio" "bufio"
) )
func SendDaemon(v interface{})[]byte{ func SendDaemon(v interface{})[]byte{
return SendMsg(LocalDaemon,v) return SendMsg(LocalDaemon,v)
} }
// func SendDaemonGuiExec(s stirng)
// SendDaemon()
func SendDaemonExec(s string){ func SendDaemonExec(s string){
SendDaemon(GJexecUserCmd(s)) SendDaemon(GJexecUserCmd(s))
} }
func SendServer(v interface{})[]byte{
return SendMsg(ADServerDaemon,v)
}
func SendServerReport(s string)[]byte{ func SendServerReport(s string)[]byte{
return SendServer(GJreport(s)) return SendServer(GJreport(s,""))
} }
func SendServerExec(s string)[]byte{ func SendServerExec(s string)[]byte{
return SendServer(GJexec(s)) return SendServer(GJexec(s))
} }
// send to server
func SendServer(v interface{})[]byte{
return SendMsg(ADServerDaemon,v)
}
// base
func SendMsg(you string ,v interface{})[]byte{ func SendMsg(you string ,v interface{})[]byte{
textbyte,err := json.Marshal(v) textbyte,err := json.Marshal(v)
...@@ -39,7 +44,7 @@ func SendMsg(you string ,v interface{})[]byte{ ...@@ -39,7 +44,7 @@ func SendMsg(you string ,v interface{})[]byte{
//发送数据 //发送数据
conn.Write(textbyte) conn.Write(textbyte)
DebugLog(string(textbyte)) PrintLog("SEND ",string(textbyte))
bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign) bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign)
var rec []byte var rec []byte
if cerr != io.EOF { if cerr != io.EOF {
...@@ -51,8 +56,6 @@ func SendMsg(you string ,v interface{})[]byte{ ...@@ -51,8 +56,6 @@ func SendMsg(you string ,v interface{})[]byte{
// 处理消息 // 处理消息
rec = DealMsgEnter(ip,msgtype,bmsg) rec = DealMsgEnter(ip,msgtype,bmsg)
}else{
PrintLog(Env_computername," Conn Read Error ", cerr)
} }
if err := conn.Close();err !=nil{ if err := conn.Close();err !=nil{
PrintLog("Conn Close ",err) PrintLog("Conn Close ",err)
......
...@@ -6,30 +6,31 @@ import( ...@@ -6,30 +6,31 @@ import(
"strings" "strings"
) )
func Execcmd_nowait(cmdargs string){ func Execcmd_nowait(cmdargs string){
DebugLog(cmdargs) if cmdargs == "" {
PrintLog("NULL COMMAND ERROR ")
return
}
PrintLog(cmdargs)
// exec.Command // exec.Command
// 只接受 shutdown,-s,-t,0 // 只接受 shutdown,-s,-t,0
// 不接受 shutdown -s -t 0 // 不接受 shutdown -s -t 0
c := strings.Split(cmdargs," ")
len := len(c)
var err error var err error
switch len{ app := cmdargs[:strings.Index(cmdargs," ")]
case 1: appargs := strings.Split(cmdargs[len(app)+1:]," ")
err = exec.Command(c[0]).Start() err = exec.Command(app,appargs...).Start()
case 2:
err = exec.Command(c[0],c[1]).Start()
case 3:
err = exec.Command(c[0],c[1],c[2]).Start()
case 4:
err = exec.Command(c[0],c[1],c[2],c[3]).Start()
case 5:
err = exec.Command(c[0],c[1],c[2],c[3],c[4]).Start()
}
if err !=nil { if err !=nil {
DebugLog(err) PrintLog(err)
} }
} }
func PsExecRemote_sd(pc ,cmd string) {
psExecCommand := `psexec \\` + pc + " -s -d "+cmd
Execcmd_nowait(psExecCommand)
}
func Msg(message string) { func Msg(message string) {
walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxIconInformation) walk.MsgBox(*new(walk.Form), "提示", message, walk.MsgBoxIconInformation)
} }
func SysMsgBox(pc,message string){
Execcmd_nowait("msg * /SERVER:"+pc+" /TIME:60 "+ message)
}
\ No newline at end of file
package main package main
import ( import (
"github.com/lxn/walk" "github.com/lxn/walk"
"io/ioutil"
"AD-Control/public" "AD-Control/public"
"strings" "strings"
"os/exec" "os/exec"
...@@ -89,7 +88,7 @@ func menuInitSoftwareInstall(ni * walk.NotifyIcon){ ...@@ -89,7 +88,7 @@ func menuInitSoftwareInstall(ni * walk.NotifyIcon){
if err != nil { if err != nil {
public.PrintLog(err) public.PrintLog(err)
} }
list,err := ioutil.ReadDir(public.Env_ADSoftlike) list,err := public.ReadDir(public.Env_ADSoftlike)
if err != nil { if err != nil {
public.PrintLog(err) public.PrintLog(err)
} }
...@@ -212,7 +211,7 @@ func menuInitFileShares(ni * walk.NotifyIcon){ ...@@ -212,7 +211,7 @@ func menuInitFileShares(ni * walk.NotifyIcon){
public.PrintLog(err) public.PrintLog(err)
} }
deptList,err := ioutil.ReadDir(public.Env_ADMain) deptList,err := public.ReadDir(public.Env_ADMain)
if err !=nil { if err !=nil {
public.PrintLog(err) public.PrintLog(err)
} }
...@@ -223,7 +222,7 @@ func menuInitFileShares(ni * walk.NotifyIcon){ ...@@ -223,7 +222,7 @@ func menuInitFileShares(ni * walk.NotifyIcon){
} }
deptshare := memberList.Name() deptshare := memberList.Name()
member,err := ioutil.ReadDir(public.Env_ADMain + `\` + deptshare) member,err := public.ReadDir(public.Env_ADMain + `\` + deptshare)
if err != nil { if err != nil {
public.PrintLog(err) public.PrintLog(err)
} }
...@@ -279,14 +278,21 @@ func fsOpenWindow(s string){ ...@@ -279,14 +278,21 @@ func fsOpenWindow(s string){
func menuInitOther(ni * walk.NotifyIcon){ func menuInitOther(ni * walk.NotifyIcon){
fa := "其他" fa := "其他"
sub := [...]string{"Excel关键词分割","移动硬盘","重新加载"} sub := [...]string{"Excel关键词分割","移动硬盘","重新加载","测试"}
// 建立空菜单 // 建立空菜单
nm,err := walk.NewMenu() nm,err := walk.NewMenu()
if err != nil { if err != nil {
public.PrintLog(err) public.PrintLog(err)
} }
lastone := len(sub)-1
for i,buttonText := range sub{ for i,buttonText := range sub{
switch i{
case 1:
if ! public.TheUser(public.AD_User_huyibo) {continue}
case lastone:
if ! public.AdminUser() {continue}
}
// 建立 子按钮 // 建立 子按钮
na := walk.NewAction() na := walk.NewAction()
if err := na.SetText(buttonText); err != nil { if err := na.SetText(buttonText); err != nil {
...@@ -298,9 +304,10 @@ func menuInitOther(ni * walk.NotifyIcon){ ...@@ -298,9 +304,10 @@ func menuInitOther(ni * walk.NotifyIcon){
case 0: case 0:
na.Triggered().Attach(oMultiSplit) na.Triggered().Attach(oMultiSplit)
case 1: case 1:
na.Triggered().Attach(o_JR_huyibo_movedisk)
case 2: na.Triggered().Attach(oJR_huyibo_movedisk)
na.Triggered().Attach(o_RebootUser) case lastone:
na.Triggered().Attach(oTest)
} }
...@@ -323,9 +330,14 @@ func menuInitOther(ni * walk.NotifyIcon){ ...@@ -323,9 +330,14 @@ func menuInitOther(ni * walk.NotifyIcon){
func oMultiSplit(){ func oMultiSplit(){
public.Execcmd_nowait(public.Startk + public.Link_MultiSplit) public.Execcmd_nowait(public.Startk + public.Link_MultiSplit)
} }
func o_JR_huyibo_movedisk(){ func oJR_huyibo_movedisk(){
public.SendDaemonExec(`F:\SamsungPortableSSD.exe`) public.SendDaemonExec(`F:\SamsungPortableSSD.exe`)
} }
func o_RebootUser(){ func oRebootUser(){
public.Execcmd_nowait(public.Env_ADSoftTool_RebootUser) public.Execcmd_nowait(public.Env_ADSoftTool_RebootUser)
} }
func oTest(){
public.SendDaemonExec(`D:\WXWork.exe`)
}
package main
import (
"fmt"
"unsafe"
"golang.org/x/sys/windows"
)
var (
modwtsapi32 *windows.LazyDLL = windows.NewLazySystemDLL("wtsapi32.dll")
modkernel32 *windows.LazyDLL = windows.NewLazySystemDLL("kernel32.dll")
modadvapi32 *windows.LazyDLL = windows.NewLazySystemDLL("advapi32.dll")
moduserenv *windows.LazyDLL = windows.NewLazySystemDLL("userenv.dll")
procWTSEnumerateSessionsW *windows.LazyProc = modwtsapi32.NewProc("WTSEnumerateSessionsW")
procWTSGetActiveConsoleSessionId *windows.LazyProc = modkernel32.NewProc("WTSGetActiveConsoleSessionId")
procWTSQueryUserToken *windows.LazyProc = modwtsapi32.NewProc("WTSQueryUserToken")
procDuplicateTokenEx *windows.LazyProc = modadvapi32.NewProc("DuplicateTokenEx")
procCreateEnvironmentBlock *windows.LazyProc = moduserenv.NewProc("CreateEnvironmentBlock")
procCreateProcessAsUser *windows.LazyProc = modadvapi32.NewProc("CreateProcessAsUserW")
procGetTokenInformation *windows.LazyProc = modadvapi32.NewProc("GetTokenInformation")
)
type WTS_CONNECTSTATE_CLASS int
type SECURITY_IMPERSONATION_LEVEL int
type TOKEN_TYPE int
type SW int
type WTS_SESSION_INFO struct {
SessionID windows.Handle
WinStationName *uint16
State WTS_CONNECTSTATE_CLASS
}
type TOKEN_LINKED_TOKEN struct {
LinkedToken windows.Token
}
const (
WTS_CURRENT_SERVER_HANDLE uintptr = 0
)
const (
WTSActive WTS_CONNECTSTATE_CLASS = iota
WTSConnected
WTSConnectQuery
WTSShadow
WTSDisconnected
WTSIdle
WTSListen
WTSReset
WTSDown
WTSInit
)
const (
SecurityAnonymous SECURITY_IMPERSONATION_LEVEL = iota
SecurityIdentification
SecurityImpersonation
SecurityDelegation
)
const (
TokenPrimary TOKEN_TYPE = iota + 1
TokenImpersonazion
)
const (
SW_HIDE SW = 0
SW_SHOWNORMAL = 1
SW_NORMAL = 1
SW_SHOWMINIMIZED = 2
SW_SHOWMAXIMIZED = 3
SW_MAXIMIZE = 3
SW_SHOWNOACTIVATE = 4
SW_SHOW = 5
SW_MINIMIZE = 6
SW_SHOWMINNOACTIVE = 7
SW_SHOWNA = 8
SW_RESTORE = 9
SW_SHOWDEFAULT = 10
SW_MAX = 1
)
const (
CREATE_UNICODE_ENVIRONMENT uint16 = 0x00000400
CREATE_NO_WINDOW = 0x08000000
CREATE_NEW_CONSOLE = 0x00000010
)
//获得当前系统活动的SessionID
func GetCurrentUserSessionId() (windows.Handle, error) {
sessionList, err := WTSEnumerateSessions()
if err != nil {
return 0xFFFFFFFF, fmt.Errorf("get current user session token: %s", err)
}
for i := range sessionList {
if sessionList[i].State == WTSActive {
return sessionList[i].SessionID, nil
}
}
if sessionId, _, err := procWTSGetActiveConsoleSessionId.Call(); sessionId == 0xFFFFFFFF {
return 0xFFFFFFFF, fmt.Errorf("get current user session token: call native WTSGetActiveConsoleSessionId: %s", err)
} else {
return windows.Handle(sessionId), nil
}
}
// WTSEnumerateSession will call the native
// version for Windows and parse the result
// to a Golang friendly version
func WTSEnumerateSessions() ([]*WTS_SESSION_INFO, error) {
var (
sessionInformation windows.Handle = windows.Handle(0)
sessionCount int = 0
sessionList []*WTS_SESSION_INFO = make([]*WTS_SESSION_INFO, 0)
)
if returnCode, _, err := procWTSEnumerateSessionsW.Call(WTS_CURRENT_SERVER_HANDLE, 0, 1, uintptr(unsafe.Pointer(&sessionInformation)), uintptr(unsafe.Pointer(&sessionCount))); returnCode == 0 {
return nil, fmt.Errorf("call native WTSEnumerateSessionsW: %s", err)
}
structSize := unsafe.Sizeof(WTS_SESSION_INFO{})
current := uintptr(sessionInformation)
for i := 0; i < sessionCount; i++ {
sessionList = append(sessionList, (*WTS_SESSION_INFO)(unsafe.Pointer(current)))
current += structSize
}
return sessionList, nil
}
// DuplicateUserTokenFromSessionID will attempt
// to duplicate the user token for the user logged
// into the provided session ID
func DuplicateUserTokenFromSessionID(sessionId windows.Handle, runas bool) (windows.Token, error) {
var (
impersonationToken windows.Handle = 0
userToken windows.Token = 0
)
if returnCode, _, err := procWTSQueryUserToken.Call(uintptr(sessionId), uintptr(unsafe.Pointer(&impersonationToken))); returnCode == 0 {
return 0xFFFFFFFF, fmt.Errorf("call native WTSQueryUserToken: %s", err)
}
if returnCode, _, err := procDuplicateTokenEx.Call(uintptr(impersonationToken), 0, 0, uintptr(SecurityImpersonation), uintptr(TokenPrimary), uintptr(unsafe.Pointer(&userToken))); returnCode == 0 {
return 0xFFFFFFFF, fmt.Errorf("call native DuplicateTokenEx: %s", err)
}
if runas {
var admin TOKEN_LINKED_TOKEN
var dt uintptr = 0
if returnCode, _, _ := procGetTokenInformation.Call(uintptr(impersonationToken), 19, uintptr(unsafe.Pointer(&admin)), uintptr(unsafe.Sizeof(admin)), uintptr(unsafe.Pointer(&dt))); returnCode != 0 {
userToken = admin.LinkedToken
}
}
if err := windows.CloseHandle(impersonationToken); err != nil {
return 0xFFFFFFFF, fmt.Errorf("close windows handle used for token duplication: %s", err)
}
return userToken, nil
}
func StartProcessAsCurrentUser(appPath, cmdLine, workDir string, runas bool) error {
var (
sessionId windows.Handle
userToken windows.Token
envInfo windows.Handle
startupInfo windows.StartupInfo
processInfo windows.ProcessInformation
commandLine uintptr = 0
workingDir uintptr = 0
err error
)
if sessionId, err = GetCurrentUserSessionId(); err != nil {
return err
}
if userToken, err = DuplicateUserTokenFromSessionID(sessionId, runas); err != nil {
return fmt.Errorf("get duplicate user token for current user session: %s", err)
}
if returnCode, _, err := procCreateEnvironmentBlock.Call(uintptr(unsafe.Pointer(&envInfo)), uintptr(userToken), 0); returnCode == 0 {
return fmt.Errorf("create environment details for process: %s", err)
}
creationFlags := CREATE_UNICODE_ENVIRONMENT | CREATE_NEW_CONSOLE
startupInfo.ShowWindow = SW_SHOW
startupInfo.Desktop = windows.StringToUTF16Ptr("winsta0\\default")
if len(cmdLine) > 0 {
commandLine = uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(cmdLine)))
}
if len(workDir) > 0 {
workingDir = uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(workDir)))
}
if returnCode, _, err := procCreateProcessAsUser.Call(
uintptr(userToken), uintptr(unsafe.Pointer(windows.StringToUTF16Ptr(appPath))), commandLine, 0, 0, 0,
uintptr(creationFlags), uintptr(envInfo), workingDir, uintptr(unsafe.Pointer(&startupInfo)), uintptr(unsafe.Pointer(&processInfo)),
); returnCode == 0 {
return fmt.Errorf("create process as user: %s", err)
}
return nil
}
\ No newline at end of file
No preview for this file type
...@@ -9,9 +9,8 @@ import ( ...@@ -9,9 +9,8 @@ import (
"AD-Control/public" "AD-Control/public"
) )
func userInit(){ func userInit(){
public.SendServerExec(public.Msg_Exec_Update) public.SendServerReport(public.Msg_UpdateVersion)
public.SendServerReport(public.Msg_Report_UserStart)
public.SendServerReport("Start User")
} }
...@@ -24,12 +23,13 @@ func menuInit(ni * walk.NotifyIcon){ ...@@ -24,12 +23,13 @@ func menuInit(ni * walk.NotifyIcon){
} }
func main() { func main() {
// flag 初始化
if public.FlagInit() {return}
// 用户初始化 // 用户初始化
userInit() userInit()
//if public.Daemon {public.Msg("版本错误")}
// 程序初始化 // 程序初始化
mw,err := walk.NewMainWindow() mw,err := walk.NewMainWindow()
if err != nil { if err != 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