Commit 8f00eec0 by 陶腾飞

2020/10/18 v1.9.0

parent e0c15c26
......@@ -3,4 +3,5 @@ testmain/
exe/
*.bat
*.ps1
*.exe
\ No newline at end of file
*.exe
.vscode/
\ No newline at end of file
......@@ -21,7 +21,7 @@ UI:
3. 文件共享
### 2. 主控使用的Daemon.exe
### 2. 域控制器使用的Daemon.exe
运行方式:
`go run .\daemon.go`
......@@ -38,6 +38,7 @@ UI:
1. 定时操作
2. 汇报情况
3. 强制备份
4. 主机唤醒
......@@ -52,8 +53,8 @@ UI:
- 2020/06/17 v1.1.0 更新在注册表中用户状态记录和修正电源状态的记录
- 2020/06/19 v1.1.1 修复备的Bug
- 2020/07/07 v1.1.2 优化备份策略
- 2020/07/22 v1.3.1 修复文件共享打开失败问题,支持对非域用户的唤醒
- 2020/07/09 v1.2.0 更新批量打开工具
- 2020/07/22 v1.3.1 修复文件共享打开失败问题,支持对非域用户的唤醒
- 2020/07/20 v1.3.0 升级备份,优化注册表值记录,启动企业微信知微运维平台
- 2020/07/22 v1.3.1 修复文件共享打开失败问题,支持对非域用户的唤醒
- 2020/07/27 v1.4.0 更新图标显示/隐藏工具,优化exec消息处理逻辑,优化企业微信知微运维平台
......@@ -66,6 +67,8 @@ UI:
- 2020/08/21 v1.8.0 合并企业微信推送,转型HTTP服务器,增加活动检测,用户备份升级
- 2020/08/21 v1.8.1 解决无法处理收到的消息问题
- 2020/08/26 v1.8.2 解决因消息框未返回而出现的关机停止问题
- 2020/08/26 v1.8.4 解决个人共享读取失败的问题
- 2020/10/18 v1.9.0 修复双向备份文件Bug,针对704室主机唤醒做调整,增加远程唤醒功能
## 其他说明
......
......@@ -7,29 +7,23 @@ import (
func initLog(){
var logpath string
// 作为主控启动
if pub.Adserver() {
logpath = pub.Dir_AD_log
} else {
// 作为PC启动
if pub.RunAsPC(pub.User_computername){
logpath = `C:\windows\system32\`
// 作为用户启动
}else{
logpath = pub.Dir_userprofile + `\`
}
// 作为PC启动
if pub.RunAsPC(pub.User_computername){
logpath = `C:\windows\system32\`
// 作为用户启动
}else{
logpath = pub.Dir_userprofile + `\`
}
pub.Loger = pub.NewLoger(logpath + "adct.log")
}
func main(){
initLog()
var reportText = flag.String( pub.Msg_Report ,"" ,"report to AD")
var execText = flag.String( pub.Msg_Exec ,"" ,"exec to LocalDaemon")
var passText = flag.String( "pass" ,"" ,"input passwork,but not need")
var wolmacText = flag.String( "wolmac" ,"" ,"input mac address for wake pc")
var woluserText = flag.String( "woluser" ,"" ,"input name for walk pc")
var wolmacText = flag.String( "wolmac" ,"" ,"input MACAddress for waking pc")
var wolhostText = flag.String( "wolhost" ,"" ,"input hostname for waking pc")
var wolallText = flag.Bool( "wolall" ,false ,"wake all Domain Computer")
var hourText = flag.Bool( "hour" ,false ,"exec task at the time")
......@@ -37,9 +31,8 @@ func main(){
if *hourText { flag_hour( );return}
if *reportText != "" { flag_report( reportText );return}
if *execText != "" { flag_exec( execText );return}
if *wolmacText != "" { flag_wolmac( wolmacText );return}
if *woluserText != "" { flag_woluser( woluserText,passText);return}
if *wolhostText != "" { flag_wolhost( wolhostText );return}
if *wolallText { flag_wolall( passText );return}
return
......@@ -49,9 +42,6 @@ func flag_report(s *string){
pub.SendServerReport(*s)
}
func flag_exec(s * string){
pub.SendServerExec(*s)
}
func flag_hour(){
nh := pub.GetHour()
switch nh{
......@@ -62,51 +52,48 @@ func flag_hour(){
}
}
func flag_wolmac(mac * string){
if err := pub.Wol(*mac); err != nil{
pub.PntError(err)
} else {
pub.PntWol(*mac)
}
//直接指定mac地址,不带主机名参数
pub.Wol_enter("",mac)
}
func flag_woluser(user,pass * string){
pcgroup := pub.Reg_query_item(
func flag_wolhost(pc *string){
mac := pub.Reg_query_key_one(
pub.Reg_Root_ac,
pub.Reg_Path_home_ac)
pub.PrintLog(pcgroup)
for _,pc := range pcgroup{
priuser:= pub.Reg_query_key_one(
pub.Reg_Root_ac,
pub.Reg_Path_home_ac+pc,
pub.Reg_Name_PrimaryUser)
if priuser == *user {
mac := pub.Reg_query_key_one(pub.Reg_Root_ac,
pub.Reg_Path_home_ac+pc,
pub.Reg_Name_MACaddress)
flag_wolmac(&mac)
pub.PntInfof("Primary User: %s,hostname:%s\n", *user,mac)
}
}
pub.Reg_Path_home_ac+*pc,
pub.Reg_Name_MACaddress)
pub.PntInfof("pc:%s,mac:%s",*pc,mac)
pub.Wol_enter(*pc,&mac)
//暂未开发
}
func flag_wolall(pass * string){
pcgroup := pub.LDAP_Get_PCGroup(pass)
limit :=1
for i,pc := range pcgroup{
pclist,err :=pub.Reg_query_list(pub.Reg_Root_ac,pub.Reg_Path_home_ac)
if err != nil{
pub.PntError(err)
}
//limit :=1
for _,pc := range pclist{
mac := pub.Reg_query_key_one(
pub.Reg_Root_ac,
pub.Reg_Path_home_ac+pc,
pub.Reg_Name_MACaddress)
// 没有主机信息没有记录到注册表
if mac == ""{
pub.PntError(pc,"查找注册表失败")
continue
}else{
if limit <= 10 {
pub.Delay(10)
limit=0
}
pub.PrintLog(i,pc,mac)
pub.RandDelay(10)
flag_wolmac(&mac)
limit +=1
// 延时计数重置
// if limit <= 10 {
// pub.Delay(10)
// limit=0
// }
// 唤醒入口
pub.Wol_enter(pc,&mac)
// 随机延时
//pub.RandDelay(10)
//limit +=1
}
}
......
......@@ -7,8 +7,8 @@ import (
func main() {
// 写入日志
pub.Loger = pub.NewLoger(pub.Dir_AD_log + `daemon.log`)
// 在家目录中写入日志
pub.Loger = pub.NewLoger(pub.Dir_userprofile + `\daemon.log`)
pub.PrintLog("start daemon!")
......
......@@ -3,10 +3,12 @@ package public
// AD-Control //
const Host_adserver string = "ADSERVER"
const ADServerDaemon string = Host_adserver + DaemonListen
const Host_thserver string = "THSERVER"
const DaemonListen string = ":16823"
const Version string = "1.8.2"
const Bak_Version string = "0819"
const ADServerDaemon string = Host_adserver + DaemonListen
const THServerDaemon string = Host_thserver + DaemonListen
const Version string = "1.9.0"
const Bak_Version string = "1013"
var Active bool = true
......@@ -18,7 +20,6 @@ var User_userdomain string = GetEnv("USERDOMAIN")
var User_name string = GetEnv("USERNAME")
var User_name_display string = GetEnvFqdn("CN")
var User_dept string = GetEnv("DEPT")
var User_dept_desplay string = GetEnv("DEPTZH")
var User_sid string = Reg_query_key_one(HKCU,`Software\Microsoft\Windows\CurrentVersion\FileAssociations`,"UserSid")
var User_sessionID string = Reg_query_item_one(HKU,User_sid+`\Volatile Environment`)
......@@ -48,8 +49,6 @@ 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 //
......
......@@ -14,6 +14,7 @@ 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_Null_Reg_Query = errors.New("Not Found Reg Query Result")
var Error_Fail_File_Open = errors.New("Fail File Open")
var Error_Fail_Token = errors.New("Get Token Fail")
......
......@@ -4,14 +4,13 @@ import (
ldap "gopkg.in/ldap.v3"
)
func LDAP_Get_PCGroup(pass * string) []string {
user := AD_User_zhiwei
func LDAP_Get_PCGroup() []string {
l, err := ldap.DialURL("ldap://127.0.0.1:389")
if err != nil {
PntError(err)
}
defer l.Close()
if err = l.Bind(user, *pass);err != nil {
if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r");err != nil {
PntError(err)
}
searchRequest := ldap.NewSearchRequest(
......@@ -34,4 +33,29 @@ func LDAP_Get_PCGroup(pass * string) []string {
pcgroup[i] = entry.GetAttributeValue("cn")
}
return pcgroup
}
func LDAP_nameTopinyin(name string) string{
l, err := ldap.DialURL("ldap://127.0.0.1:389")
if err != nil {
PntError(err)
}
defer l.Close()
if err = l.Bind(AD_User_zhiwei, "1Q2W3e4r");err != nil {
PntError(err)
}
searchRequest := ldap.NewSearchRequest(
//"ou=情报部门,dc=zhiweireach,dc=com",
"ou=情报部门,dc=zhiweireach,dc=com",
ldap.ScopeWholeSubtree,ldap.NeverDerefAliases, 0, 0, false,
"(cn="+name+")",
//"(&(objectClass=organizationalPerson))",
[]string{"sAMAccountName"},
nil,
)
sr, err := l.Search(searchRequest)
if err != nil {
PntError(err)
}
return sr.Entries[0].GetAttributeValue("sAMAccountName")
}
\ No newline at end of file
......@@ -50,7 +50,14 @@ func DealMsg(msgtype, url string, unmsg []byte) []byte {
ParseJson(unmsg,&pmsg)
ice := pmsg.MsgDeal()
ret = ReParseJson(&ice)
// 唤醒 消息
case Msg_Wake:
var pmsg MJwake
ParseJson(unmsg,&pmsg)
ice := pmsg.MsgDeal()
ret = ReParseJson(&ice)
// 错误 消息
case Msg_Error:
PntError(string(unmsg))
......@@ -105,7 +112,7 @@ func (rep *MJreport)MsgDeal() interface{} {
case Msg_Report_WillTurnOnPC:
// 如果是被开机唤醒o
// 如果是被开机唤醒
id := rep.Reg_Query_ADDC(Reg_Name_BeWakedID)
if id != ""{
SendWxworkTextToAUser(id,"主机已启动,一切就绪~")
......@@ -266,7 +273,7 @@ func (bak * MJbackup)MsgDeal() interface{}{
}
SendMsg(bak.MsgType,bak)
SendADMsg(bak.MsgType,bak)
return nil
// 判断是否能进行备份
......@@ -287,6 +294,23 @@ func (bak * MJbackup)MsgDeal() interface{}{
// 关于 wake 唤醒 的 消息处理
func (wake * MJwake)MsgDeal() interface{}{
switch wake.Instruction {
case Msg_Wake_Status_Req:
wake.Instruction = Msg_Wake_Status_Over
go Wol_enter(wake.Computername,&wake.MACAddress)
return wake
case Msg_Wake_Status_Over:
return nil
}
return nil
}
// 关于 error 错误 的 消息处理
func (err * MJerror)MsgDeal() interface{}{
......@@ -296,6 +320,7 @@ func (err * MJerror)MsgDeal() interface{}{
// 关于 wxwork 企业微信 的 消息处理
func (wxwork * MJwxwork)MsgDealSend() {
......@@ -344,7 +369,7 @@ func (wxwork * MJwxwork)MsgDealSend() {
}
// 进行唤醒
go Wol(mac)
go Wol_enter(pc,&mac)
go func(userid string){
for i:=0;i<10;i++{
......
......@@ -15,7 +15,7 @@ const Msg_Exec string = "exec"
const Msg_Backup string = "backup"
const Msg_Error string = "error"
const Msg_Wxwork string = "wxwork"
const Msg_Wake string = "wake"
// base word ////////////////////////////////////////////////////////////////
......@@ -81,6 +81,9 @@ const Msg_Exec_OpenAdminEXE string = "OpenAdmin"
// msg wkae type ////////////////////////////////////////////////////////////////
const Msg_Wake_Status_Req string = "WakeReq"
const Msg_Wake_Status_Over string = "WakeOver"
// wxwork event key ////////////////////////////////////////////////////////////////
const WXEK_zwDevopsPowerWake string = "zwdevops_power_wake"
......@@ -109,7 +112,6 @@ type MJbase struct{
Explain string `json:"explain"`
Username string `json:"username"`
Computername string `json:"computername"`
Dept string `json:"dept"`
Timestamp int64 `json:"timestamp"`
DataBool bool `json:"databool"`
DataStr string `json:"datastr"`
......@@ -134,10 +136,16 @@ type MJbackup struct{
MJbase
Version string `json:"version"`
}
// wake Json Format /////////////////////////////////////////////////////
type MJwake struct {
MJbase
MACAddress string
}
// error Json Format /////////////////////////////////////////////////////
type MJerror struct{
MJbase
}
// wxwork Json Format /////////////////////////////////////////////////////
type MJwxwork struct {
Instruction string
UserID string
......@@ -214,7 +222,6 @@ func GJexecDIYFlag(flag,command string) MJexec{
}
func (exec * MJexec)Init(s string){
exec.Dept = User_dept
exec.Username = User_name
exec.Computername = User_computername
exec.Timestamp = NowTimestamp()
......@@ -230,7 +237,6 @@ func (exec * MJexec)PsExec(){
// Backup
func GJbackup()interface{}{
......@@ -247,6 +253,20 @@ func (bak * MJbackup)init() {
// wake
func GJwake(host,mac string) interface{} {
var wake MJwake
wake.MsgType = Msg_Wake
wake.Instruction = Msg_Wake_Status_Req
wake.Computername = host
wake.MACAddress = mac
return wake
}
// error
func GJerror(e error)interface{}{
......@@ -256,7 +276,6 @@ func GJerror(e error)interface{}{
}
func (err * MJerror)init (e error){
err.Username = User_name
err.Dept = User_dept
err.Timestamp = NowTimestamp()
err.Computername = User_computername
err.MsgType = Msg_Error
......@@ -264,6 +283,7 @@ func (err * MJerror)init (e error){
}
// wxwork
func (wxwork * MJwxwork)SendText(text string) {
......
......@@ -72,6 +72,10 @@ func PntWol(v ...interface{}){
Loger.SetPrefix("WOL ")
Loger.Println(v ...)
}
func PntWolRemote(v ...interface{}){
Loger.SetPrefix("WOLREMOTE ")
Loger.Println(v ...)
}
func PntSend(v ...interface{}){
Loger.SetPrefix("Send ")
Loger.Println(v ...)
......
......@@ -23,11 +23,10 @@ func ParseJson(unmsg []byte,v interface{}){
}
// Json 转 Byte
func ReParseJson(v * interface{}) []byte{
func ReParseJson(v * interface{}) []byte{
textbyte,err := json.Marshal(*v)
if err !=nil {
PntError("Json to byte Error ",v,err)
}
return textbyte
}
......
......@@ -10,27 +10,31 @@ import (
func SendServerReport(s string) {
SendMsg(Msg_Report,GJreport(s))
SendADMsg(Msg_Report,GJreport(s))
}
func SendServerExec(s string) {
SendMsg(Msg_Exec,GJexec(s))
}
func SendServerExecJ(v interface{}) {
SendMsg(Msg_Exec,v)
func SendServerExec(v interface{}) {
SendADMsg(Msg_Exec,v)
}
func SendServerError(err error) {
SendMsg(Msg_Error,GJerror(err))
SendADMsg(Msg_Error,GJerror(err))
}
// base
func SendMsg(msgtype string ,v interface{}) {
// base server msg
func SendADMsg(msgtype string ,v interface{}){
SendMsg(ADServerDaemon,msgtype,v)
}
func SendTHMsg(msgtype string ,v interface{}){
SendMsg(THServerDaemon,msgtype,v)
}
// base msg
func SendMsg(server,msgtype string ,v interface{}) {
//将结构体 转化成 byte
textbyte,err := json.Marshal(v)
if err !=nil {
PntError("Json to String Error ",v,err)
}
link := fmt.Sprintf("http://%s/%s",ADServerDaemon,msgtype)
link := fmt.Sprintf("http://%s/%s",server,msgtype)
PntSend(link,string(textbyte))
//发送数据
......
......@@ -78,3 +78,16 @@ func Adserver() bool{
if Host_adserver == User_computername {return true}
return false
}
func BeSecNetwork(hostname * string) bool{
//自动转大写
*hostname = strings.ToUpper(*hostname)
//京东和HB组报告研究中心组,是第二个网络
if strings.HasPrefix(*hostname,"HB") || strings.HasPrefix(*hostname,"JD") || strings.HasPrefix(*hostname,"BGYJZX"){
return true
}
return false
}
\ No newline at end of file
......@@ -179,6 +179,9 @@ func PSTest_Connection(host string) (bool,error) {
return false,nil
}
}
//
//
// local
......@@ -196,6 +199,7 @@ func OpenWindow(s string){
}
//
//
// remote exec
......@@ -223,6 +227,9 @@ func Pskill(pc ,cmd string) {
Execcmd_nowait(psExecCommand)
}
//
//
// msg show
......@@ -280,6 +287,18 @@ func Reg_query_item_one(root int ,path string) string {
return ""
}
}
func Reg_query_list(root int ,path string) ([]string,error) {
if k, kerr := registry.OpenKey(reg_prase(&root),path, registry.READ);kerr==nil{
defer k.Close()
if sk,err := k.ReadSubKeyNames(0); err ==nil{
return sk,nil
} else{
return nil,Error_Null_Reg_Query
}
} else {
return nil,Error_Null_Reg_Query
}
}
func Reg_IfExist_item(root int ,path string) error {
k,err := registry.OpenKey(reg_prase(&root),path, registry.READ)
defer k.Close()
......
......@@ -15,9 +15,23 @@ import (
// 网络唤醒魔包技术白皮书地址
// https://www.amd.com/system/files/TechDocs/20213.pdf
func Wol(mac string) error{
//nic := ""
func Wol_enter(pc string,mac *string ){
// 如果是704,且只有主控进行唤醒操作
if BeSecNetwork(&pc) && Adserver(){
SendTHMsg(Msg_Wake,GJwake(pc,*mac))
// 否则本地直接唤醒(用于辅控在其他的网络唤醒)
// 如果测试其他网络的滑行情况,需要注释else代码块
}else {
PntWol(pc,*mac)
if err := wol(*mac); err != nil{
PntError(err)
}
}
}
func wol(mac string) error{
hw := strings.Replace(strings.Replace(mac, ":", "", -1), "-", "", -1)
if len(hw) != 12 {
......
......@@ -3,7 +3,7 @@ import (
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
"strings"
pub "AD-Control/public"
pub "AD-Control-Golang/public"
)
const (
......@@ -124,7 +124,7 @@ func menuInitSoftwareInstall(ni * walk.NotifyIcon){
func siEnter_admin(softname string){
go pub.Msg("等待弹出安装窗口,请稍等。。")
ifFile := pub.Exist(`C:\windows\`+softname)
pub.SendServerExecJ(pub.GJexecInstallSoftware(ifFile,softname))
pub.SendServerExec(pub.GJexecInstallSoftware(ifFile,softname))
}
......@@ -138,7 +138,7 @@ func siEnter_admin(softname string){
func menuInitTools(ni * walk.NotifyIcon){
fa := "工具集合"
sub := [...]string{"Excel关键词分割","备份用户文件","优雅批量打开网页","隐藏/显示桌面图标","更新手机代理程序","PDF转换"}
sub := [...]string{"Excel关键词分割","备份用户文件","优雅批量打开网页","隐藏/显示桌面图标","更新手机代理程序","PDF转换","窗口拦截"}
// 建立空菜单
nm,err := walk.NewMenu()
if err != nil {
......@@ -173,6 +173,8 @@ func menuInitTools(ni * walk.NotifyIcon){
na.Triggered().Attach(tUpdateATool)
case 5:
na.Triggered().Attach(tPdfTrans)
case 6:
na.Triggered().Attach(tWindowsBlock)
}
// 将 子按钮 添加到 菜单
......@@ -260,7 +262,7 @@ func tBakcupUser(){
pub.SendServerReport(pub.Msg_Report_InitBak)
}
}
// 其他工具 备份用户文件
// 其他工具 Pdf转换
func tPdfTrans(){
AcrobatDC := `C:\Application\AcrobatDC\AcrobatDCPortable.exe`
if pub.NotExist(AcrobatDC){
......@@ -268,7 +270,7 @@ func tPdfTrans(){
return
}
go pub.Msg(`Acrobat DC正在打开`)
pub.SendServerExecJ(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE,AcrobatDC))
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE,AcrobatDC))
return
}
......@@ -306,7 +308,17 @@ func tHideShowIcon(){
}
}
// 其他工具 火绒窗口拦截工具
func tWindowsBlock(){
PopBlock := `C:\Progra~2\zhiwei\huorong_windows_block\PopBlock.exe`
if pub.NotExist(PopBlock){
go pub.Msg(`火绒窗口拦截工具没有安装,请先从小工具中"软件安装"中进行安装`)
return
}
pub.SendServerExec(pub.GJexecDIYFlag(pub.Msg_Exec_OpenAdminEXE,PopBlock))
return
}
//---------------------------------------------------------------
//
// File share
......@@ -317,7 +329,7 @@ func tHideShowIcon(){
func menuInitFileShares(ni * walk.NotifyIcon){
fa := "文件共享"
// // 建立空菜单
// 建立空菜单
mfs,err := walk.NewMenu()
if err != nil {
pub.PntError(err)
......@@ -337,7 +349,7 @@ func menuInitFileShares(ni * walk.NotifyIcon){
}
deptshare := memberList.Name()
// 不在 其他共享 里 显示自己部门的共享
if deptshare == pub.User_dept_desplay{
if deptshare == pub.User_dept{
continue
}
if deptshare == "DfsrPrivate"{
......@@ -483,7 +495,7 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
exec.Explain = "显示"
exec.DataBool = true
}
pub.SendServerExecJ(exec)
pub.SendServerExec(exec)
}
......
......@@ -14,9 +14,6 @@ import (
pub "AD-Control-Golang/public"
)
var baseDay,baseHour = pub.GetDateHour()
var baseX,baseY = GetMousePos()
func GetMousePos() (int,int) {
C.getMouse()
x :=int(C.point.x)
......@@ -56,6 +53,9 @@ func menuInit(ni * walk.NotifyIcon){
func isActive(){
for {
d,h := pub.GetDateHour()
ox,oy := GetMousePos()
pub.Delay(3602)
// 新的一天
if d == 9 {
......@@ -67,12 +67,11 @@ func isActive(){
x,y := GetMousePos()
// 如果处于闲置状态
if baseX == x && baseY == y && pub.IsPrimaryUser(pub.User_name){
if ox == x && oy == y {
pub.MsgShutdown("即将关机,如需取消,点击小工具-电源选项-取消关机计时")
}
}
pub.Delay(3602)
}
}
......
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