Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
AD-Control-Golang
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陶腾飞
AD-Control-Golang
Commits
850d3510
Commit
850d3510
authored
Jul 28, 2020
by
陶腾飞
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
v1.5.0 知微运维平台升级支持开机重启关机、支持批量百度搜索
parent
0a7cbf9e
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
337 additions
and
162 deletions
+337
-162
adct/adct.go
+0
-5
public/env.go
+32
-23
public/error.go
+3
-0
public/msg_deal.go
+158
-44
public/msg_init.go
+9
-6
public/print.go
+13
-14
public/send.go
+5
-2
public/time.go
+1
-3
public/user.go
+0
-1
public/win.go
+6
-1
users/menu.go
+40
-12
wxwork/wxwork.go
+70
-51
No files found.
adct/adct.go
View file @
850d3510
...
...
@@ -24,7 +24,6 @@ func main(){
var
backupText
=
flag
.
String
(
pub
.
Msg_Backup
,
""
,
"backup status to AD"
)
var
reportText
=
flag
.
String
(
pub
.
Msg_Report
,
""
,
"report to AD"
)
var
execText
=
flag
.
String
(
pub
.
Msg_Exec
,
""
,
"exec to LocalDaemon"
)
var
regText
=
flag
.
String
(
pub
.
Msg_Reg
,
""
,
"mod reg"
)
//var userText = flag.String( "user" ,"" ,"who is running me")
var
passText
=
flag
.
String
(
"pass"
,
""
,
"input passwork,but not need"
)
var
wolmacText
=
flag
.
String
(
"wolmac"
,
""
,
"input mac address for wake pc"
)
...
...
@@ -38,7 +37,6 @@ func main(){
if
*
reportText
!=
""
{
flag_report
(
reportText
);
return
}
if
*
backupText
!=
""
{
flag_bakcup
(
backupText
);
return
}
if
*
execText
!=
""
{
flag_exec
(
execText
);
return
}
if
*
regText
!=
""
{
flag_reg
(
regText
);
return
}
if
*
wolmacText
!=
""
{
flag_wolmac
(
wolmacText
);
return
}
if
*
woluserText
!=
""
{
flag_woluser
(
woluserText
,
passText
);
return
}
if
*
wolallText
{
flag_wolall
(
passText
);
return
}
...
...
@@ -65,9 +63,6 @@ func flag_bakcup(s *string){
func
flag_exec
(
s
*
string
){
pub
.
SendServerExec
(
*
s
)
}
func
flag_reg
(
s
*
string
){
;
}
func
flag_hour
(){
nh
:=
pub
.
GetHour
()
switch
nh
{
...
...
public/env.go
View file @
850d3510
...
...
@@ -8,19 +8,19 @@ const DaemonListen string = ":" + DaemonPort
const
ADServerDaemon
string
=
Host_adserver
+
DaemonListen
const
WxwrokDaemon
string
=
":16823"
const
RandMax
int
=
60
const
Version
string
=
"1.
4
.0"
const
Version
string
=
"1.
5
.0"
// user //
var
User_computername
string
=
GetEnv
(
"COMPUTERNAME"
)
var
User_homeshare
string
=
GetEnv
(
"HOMESHARE"
)
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_computername
string
=
GetEnv
(
"COMPUTERNAME"
)
var
User_homeshare
string
=
GetEnv
(
"HOMESHARE"
)
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`
)
...
...
@@ -39,8 +39,8 @@ const SMB_ADSoftPlusSync string = SMB_ADSoft + `plus\sync\`
// Local Folder //
var
Dir_userprofile
string
=
GetEnv
(
"USERPROFILE"
)
var
Dir_appdata
string
=
GetEnv
(
"appdata"
)
var
Dir_userprofile
string
=
GetEnv
(
"USERPROFILE"
)
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\`
...
...
@@ -48,7 +48,7 @@ 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_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\`
...
...
@@ -68,7 +68,6 @@ const App_adct string = SMB_ADSoftApplication + "adct.exe"
const
App_MultiSplit
string
=
SMB_ADSoftOthTool
+
"win_MultiSplit.exe"
const
App_Sync
string
=
`syncappw.exe`
const
App_Sync_dir
string
=
`C:\Progra~1\zhiwei\AllWay_Sync\Bin\syncappw.exe`
//const App_MulitOpenPages string = SMB_ADOtherTool + "MultiOpenPages.bat"
// backup //
...
...
@@ -83,10 +82,11 @@ const (
HKLM
HKU
)
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_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_Path_home_zhu
string
=
Reg_Path_home
+
`\ZhiWeiUsers\`
// use for adserver,not for dc
const
Reg_Name_TurnOnTime
string
=
"TurnOnTime"
...
...
@@ -104,8 +104,9 @@ 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 //
// reg value //
var
Reg_Value_WeDriveDir
string
=
Reg_query_key_one
(
HKCU
,
Reg_Path_home
,
Reg_Name_WeDriveDir
)
var
Reg_Value_ON
string
=
"ON"
var
Reg_Value_OFF
string
=
"OFF"
...
...
@@ -118,16 +119,24 @@ var Reg_Value_LogStatus_OUT string = "OUT"
const
Link_WxworkBot
string
=
`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
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"
const
WxworkTokenMsgSend
string
=
"AvAQlFNxy1UQB3CjRml3GfKf7Y"
const
WxworkEncodingAseKey
string
=
"AwLPVXc1MxPmqo7dzw8CYbbWku0nZlDwWDVCSknqEFy"
const
WxworkReceiverId
string
=
"ww49cfd580625083c9"
const
WxworkCorid
string
=
"ww49cfd580625083c9"
const
WxworkCorpSecret
string
=
"ckANI7SsRh0v_zu2uN7gitRHvTwqRAh8oG1a20xJo_I"
const
WxWorkAgentID
string
=
"1000014"
// wxwork event key //
const
WXEK_zwDevopsPowerWake
string
=
"zwdevops_power_wake"
const
WXEK_zwDevopsPowerTurnOFF
string
=
"zwdevops_power_turnoff"
const
WXEK_zwDevopsPowerReboot
string
=
"zwdevops_power_reboot"
const
WXEK_zwDevopsPowerStatus
string
=
"zwdevops_power_status"
// wxwork answaer //
const
WXRec_WakeSuccess
string
=
"主机已启动!"
\ No newline at end of file
const
WXRec_WakeSuccess
string
=
"主机已启动,一切就绪~"
\ No newline at end of file
public/error.go
View file @
850d3510
...
...
@@ -23,6 +23,8 @@ 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
=
"后台错误"
var
Error_WXWork_NotDominUser_STR
=
"您的主机暂时不支持该功能"
func
NewError
(
s
string
)
error
{
return
errors
.
New
(
s
)
}
\ No newline at end of file
public/msg_deal.go
View file @
850d3510
...
...
@@ -118,12 +118,6 @@ func (rep *MJreport)Msg_Deal() interface{} {
Reg_Name_LogStatus
,
Reg_Value_LogStatus_OUT
)
case
Msg_Report_OverCopyToWeDrive
:
go
func
()
{
Delay
(
600
)
CopyStatusWeDrive
[
rep
.
Dept
]
=
true
}()
default
:
PntOth
(
"Default Report Json "
,
rep
.
Instruction
)
...
...
@@ -173,11 +167,9 @@ func (exec *MJexec)Msg_Deal()interface{}{
case
Msg_Exec_HideShowIcon
:
var
hidetype
string
if
exec
.
DataBool
{
exec
.
Explain
=
"显示"
hidetype
=
"+"
}
else
{
exec
.
Explain
=
"隐藏"
hidetype
=
"-"
}
else
{
hidetype
=
"+"
}
exec
.
Command
=
"attrib "
+
hidetype
+
`h `
+
exec
.
DataStr
exec
.
PsExec
()
...
...
@@ -296,61 +288,183 @@ func (bak * MJbackup)Msg_Deal() interface{}{
func
(
wxwork
*
MJwxwork
)
Msg_Deal
()
interface
{}{
switch
(
wxwork
.
Instruction
)
{
switch
wxwork
.
Instruction
{
case
Msg_Wxwork_UserWake
:
var
zhiweiuser
bool
// 在注册表中查询记录
pc
:=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_PrimayComputerName
)
mac
:=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_MACAddress
)
var
domainUser
bool
=
true
var
pc
,
mac
string
var
err
error
if
pc
==
""
||
mac
==
""
{
pc
=
wxwork
.
Reg_Query_ZhiWeiUsers
(
Reg_Name_PrimayComputerName
)
mac
=
wxwork
.
Reg_Query_ZhiWeiUsers
(
Reg_Name_MACAddress
)
zhiweiuser
=
true
}
if
pc
==
""
||
mac
==
""
{
wxwork
.
Text
=
"如果你不是情报部门,那么暂时还不支持该功能"
return
wxwork
// 在注册表中查询 域用户 记录
if
err
=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_du
+
wxwork
.
Name
);
err
==
nil
{
pc
=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_PrimayComputerName
)
mac
=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_MACAddress
)
// 在注册表中查询 知微用户 记录
}
else
if
err
=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_zhu
+
wxwork
.
Name
);
err
==
nil
{
pc
=
wxwork
.
Reg_Query_ZhiWeiUsers
(
Reg_Name_PrimayComputerName
)
mac
=
wxwork
.
Reg_Query_ZhiWeiUsers
(
Reg_Name_MACAddress
)
domainUser
=
false
}
else
{
wxwork
.
Text
=
Error_WXWork_NotDominUser_STR
break
}
// 查看电源状态
status
,
err
:=
PSTest_Connection
(
pc
)
P
rintLog
(
pc
,
mac
,
wxwork
.
Name
,
Msg_Wxwork_UserWake
,
status
)
P
ntWxwork
(
pc
,
mac
,
wxwork
.
Name
,
Msg_Wxwork_UserWake
,
status
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_Down_STR
return
wxwor
k
brea
k
}
if
status
{
wxwork
.
Text
=
"已经开机了哦~"
return
wxwor
k
brea
k
}
// 只有域用户有效
// 写入被唤醒的ID用于判断是否是被企业微信唤醒
if
zhiweiu
ser
{
if
domainU
ser
{
Reg_Write_ADDC
(
pc
,
Reg_Name_BeWakedID
,
wxwork
.
UserID
)
go
func
(
userid
string
){
for
i
:=
0
;
i
<
10
;
i
++
{
Delay
(
30
)
status
,
_
:=
PSTest_Connection
(
pc
)
if
status
{
SendWxworkTextToAUser
(
userid
,
"主机已启动!"
)
return
}
}
}(
wxwork
.
UserID
)
}
//
先回复,后
唤醒
//
进行
唤醒
go
Wol
(
mac
)
go
func
(
userid
string
){
for
i
:=
0
;
i
<
10
;
i
++
{
Delay
(
30
)
status
,
_
:=
PSTest_Connection
(
pc
)
if
status
{
SendWxworkTextToAUser
(
userid
,
"主机已启动!"
)
return
}
}
}(
wxwork
.
UserID
)
wxwork
.
Text
=
"开始唤醒,请等待~"
default
:
wxwork
.
Text
=
""
}
case
Msg_Wxwork_Reboot
:
// 检查是否是域用户
err
:=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_du
+
wxwork
.
Name
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_NotDominUser_STR
break
}
// 检查注册表的主机 是否存在
pc
:=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_PrimayComputerName
)
if
pc
==
""
{
wxwork
.
Text
=
Error_WXWork_Down_STR
break
}
// 检查 主机连接情况
status
,
err
:=
PSTest_Connection
(
pc
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_Down_STR
break
}
if
!
status
{
wxwork
.
Text
=
"主机已关机或无法连接主机"
break
}
Execcmd_wait
(
`shutdown -r -t 0 -m \\`
+
pc
)
Reg_Write_ADDC
(
pc
,
Reg_Name_BeWakedID
,
wxwork
.
UserID
)
go
func
(
name
,
userid
string
){
var
rebooted
bool
=
false
for
i
:=
0
;
i
<
30
;
i
++
{
status
,
_
:=
PSTest_Connection
(
pc
)
if
!
status
{
rebooted
=
true
}
if
status
&&
rebooted
{
SendWxworkTextToAUserWithName
(
name
,
userid
,
"重启完成~"
)
return
}
}
}(
wxwork
.
Name
,
wxwork
.
UserID
)
wxwork
.
Text
=
"开始重启,请等待~"
break
case
Msg_Wxwork_TurnOFF
:
// 检查是否是域用户
err
:=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_du
+
wxwork
.
Name
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_NotDominUser_STR
break
}
// 检查注册表的主机 是否存在
pc
:=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_PrimayComputerName
)
if
pc
==
""
{
wxwork
.
Text
=
Error_WXWork_Down_STR
break
}
// 检查 主机连接情况
status
,
err
:=
PSTest_Connection
(
pc
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_Down_STR
break
}
if
!
status
{
wxwork
.
Text
=
"主机已关机或无法连接主机"
break
}
Execcmd_wait
(
`shutdown -s -t 0 -m \\`
+
pc
)
Reg_Write_ADDC
(
pc
,
Reg_Name_BeWakedID
,
wxwork
.
UserID
)
go
func
(
name
,
userid
string
){
for
i
:=
0
;
i
<
10
;
i
++
{
Delay
(
30
)
status
,
_
:=
PSTest_Connection
(
pc
)
if
!
status
{
SendWxworkTextToAUserWithName
(
name
,
userid
,
"关机已完成~"
)
return
}
}
}(
wxwork
.
Name
,
wxwork
.
UserID
)
wxwork
.
Text
=
"开始关机,请等待~"
case
Msg_Wxwork_Status
:
var
domainUser
bool
=
true
var
pc
string
var
err
error
// 在注册表中查询 域用户 记录
if
err
=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_du
+
wxwork
.
Name
);
err
==
nil
{
pc
=
wxwork
.
Reg_Query_ADUsers
(
Reg_Name_PrimayComputerName
)
// 在注册表中查询 知微用户 记录
}
else
if
err
=
Reg_IfExist_item
(
Reg_Root_ac
,
Reg_Path_home_zhu
+
wxwork
.
Name
);
err
==
nil
{
pc
=
wxwork
.
Reg_Query_ZhiWeiUsers
(
Reg_Name_PrimayComputerName
)
domainUser
=
false
}
else
{
wxwork
.
Text
=
Error_WXWork_NotDominUser_STR
break
}
// 检查 主机连接情况
status
,
err
:=
PSTest_Connection
(
pc
)
if
err
!=
nil
{
wxwork
.
Text
=
Error_WXWork_Down_STR
break
}
if
status
{
wxwork
.
Text
=
"主机已启动"
}
else
if
!
status
&&
!
domainUser
{
wxwork
.
Text
=
"主机已关闭或禁用了ICMP(请允许防火墙)"
}
else
{
wxwork
.
Text
=
"主机已关闭"
}
}
wxwork
.
Instruction
=
""
return
wxwork
}
...
...
public/msg_init.go
View file @
850d3510
...
...
@@ -84,6 +84,9 @@ const Msg_Exec_HideShowIcon string = "HideShowIcon"
// msg wxwork type ////////////////////////////////////////////////////////////////
const
Msg_Wxwork_UserWake
string
=
"UserWake"
const
Msg_Wxwork_Reboot
string
=
"Reboot"
const
Msg_Wxwork_TurnOFF
string
=
"TurnOFF"
const
Msg_Wxwork_Status
string
=
"Status"
// Registry Root
...
...
@@ -263,13 +266,13 @@ func (err * MJerror)init (e error){
err
.
MsgType
=
Msg_Error
err
.
Instruction
=
e
.
Error
()
}
func
GJwxworkText
(
name
,
userid
,
text
*
string
,
instruction
string
)
interface
{}{
func
GJwxworkText
(
name
,
userid
*
string
,
instruction
string
)
interface
{}{
var
wxwork
MJwxwork
wxwork
.
MsgType
=
Msg_Wxwork
wxwork
.
Name
=
*
name
wxwork
.
UserID
=
*
userid
wxwork
.
Text
=
*
text
wxwork
.
Instruction
=
instruction
wxwork
.
MsgType
=
Msg_Wxwork
wxwork
.
Name
=
*
name
wxwork
.
UserID
=
*
userid
wxwork
.
Text
=
""
wxwork
.
Instruction
=
instruction
return
wxwork
}
...
...
public/print.go
View file @
850d3510
...
...
@@ -27,6 +27,7 @@ func Sprintf(f string,v ...interface{})string {
// Print Type
//
func
PrintLog
(
v
...
interface
{}){
log
.
SetPrefix
(
"Output "
)
log
.
Println
(
v
...
)
...
...
@@ -81,25 +82,22 @@ func PntSend(v ...interface{}){
Loger
.
SetPrefix
(
"Send "
)
Loger
.
Println
(
v
...
)
}
func
P
rintPrefix
(
s
string
,
v
...
interface
{}){
Loger
.
SetPrefix
(
s
)
func
P
ntWxwork
(
v
...
interface
{}){
log
.
SetPrefix
(
"WXWORK"
)
log
.
Println
(
v
...
)
Loger
.
SetPrefix
(
"WXWORK "
)
Loger
.
Println
(
v
...
)
}
func
PntWxwork
(
v
...
interface
{}){
Loger
.
SetPrefix
(
"WXWORK"
)
log
.
Println
(
v
...
)
func
PntWxSendText
(
v
...
interface
{}){
Loger
.
SetPrefix
(
"WxSendText "
)
Loger
.
Println
(
v
...
)
}
func
PntWxworkf
(
f
string
,
v
...
interface
{}){
Loger
.
SetPrefix
(
"WXWORK "
)
log
.
SetPrefix
(
"WxSendText "
)
log
.
Println
(
v
...
)
Loger
.
Printf
(
f
,
v
...
)
}
func
PntWxSendMsgText
(
v
...
interface
{}){
Loger
.
SetPrefix
(
"WxSendMsgText "
)
log
.
Println
(
v
...
)
func
PntWxRecText
(
v
...
interface
{}){
Loger
.
SetPrefix
(
"WxRecText "
)
Loger
.
Println
(
v
...
)
}
log
.
SetPrefix
(
"WxRecText "
)
log
.
Println
(
v
...
)
}
\ No newline at end of file
public/send.go
View file @
850d3510
...
...
@@ -116,7 +116,7 @@ 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
{
...
...
@@ -146,4 +146,7 @@ func SendWxworkTextToAUser(id,text string) error{
}
func
SendWxworkTextToAUserWithName
(
name
,
id
,
text
string
)
error
{
PntWxSendText
(
name
,
text
)
return
SendWxworkTextToAUser
(
id
,
text
)
}
public/time.go
View file @
850d3510
...
...
@@ -43,12 +43,10 @@ func Rand(i * int)int{
}
// 程序挂起 i 秒
func
Delay
(
i
int
){
PntInfo
(
"Delay "
,
i
)
time
.
Sleep
(
time
.
Duration
(
i
)
*
time
.
Second
)
<-
time
.
After
(
time
.
Duration
(
i
)
*
time
.
Second
)
}
// 随机挂起 x 秒
func
RandDelay
(
i
int
){
ri
:=
Rand
(
&
i
)
PntInfo
(
"RandDelay "
,
ri
)
time
.
Sleep
(
time
.
Duration
(
ri
)
*
time
.
Second
)
}
public/user.go
View file @
850d3510
...
...
@@ -9,7 +9,6 @@ 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"
const
AD_User_xuwenqiang
string
=
"xuwenqiang"
const
AD_User_zhiwei
string
=
"zhiwei@zhiweireach.com"
...
...
public/win.go
View file @
850d3510
...
...
@@ -84,7 +84,7 @@ func Execcmd_copy(source,target string){
}
}
func
Execcmd_wait
(
cmdargs
string
,
){
func
Execcmd_wait
(
cmdargs
string
){
app
,
appargs
,
err
:=
execcmd_base
(
cmdargs
)
if
err
!=
nil
{
PntError
(
err
)
...
...
@@ -280,6 +280,11 @@ func Reg_query_item_one(root int ,path string) string {
return
""
}
}
func
Reg_IfExist_item
(
root
int
,
path
string
)
error
{
k
,
err
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
)
defer
k
.
Close
()
return
err
}
func
Reg_query_item
(
root
int
,
path
string
)
[]
string
{
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
);
kerr
==
nil
{
defer
k
.
Close
()
...
...
users/menu.go
View file @
850d3510
...
...
@@ -6,6 +6,10 @@ import (
pub
"AD-Control/public"
)
const
(
urlKey
=
iota
baiduKey
)
//---------------------------------------------------------
//
...
...
@@ -221,17 +225,15 @@ func tBatchOpenWeb(){
},
},
PushButton
{
Text
:
"
打开网页
"
,
Text
:
"
批量打开网址
"
,
OnClicked
:
func
()
{
for
seq
,
web
:=
range
pub
.
Splitln
(
inTE
.
Text
()){
if
web
==
""
{
continue
}
pub
.
Execcmd_nowait
(
`C:\Progra~2\Google\Chrome\Application\chrome.exe `
+
web
)
pub
.
Delay
(
2
)
outTE
.
AppendText
(
pub
.
Sprintf
(
"%d %s
\n
"
,
seq
+
1
,
web
))
}
batchOpenWeb
(
inTE
,
outTE
,
urlKey
)
},
},
PushButton
{
Text
:
"批量百度搜索"
,
OnClicked
:
func
()
{
batchOpenWeb
(
inTE
,
outTE
,
baiduKey
)
},
},
PushButton
{
...
...
@@ -244,6 +246,28 @@ func tBatchOpenWeb(){
},
}
.
Run
()
}
func
batchOpenWeb
(
inTE
,
outTE
*
walk
.
TextEdit
,
batch
int
){
var
cmd
string
chrome
:=
`C:\Progra~2\Google\Chrome\Application\chrome.exe `
switch
batch
{
case
urlKey
:
cmd
=
""
case
baiduKey
:
cmd
=
"https://www.baidu.com/s?wd="
}
cmd
=
chrome
+
cmd
for
seq
,
web
:=
range
pub
.
Splitln
(
inTE
.
Text
()){
if
web
==
""
{
continue
}
pub
.
Execcmd_nowait
(
cmd
+
web
)
pub
.
Delay
(
2
)
outTE
.
AppendText
(
pub
.
Sprintf
(
"%d %s
\n
"
,
seq
+
1
,
web
))
}
}
// 其他工具 备份用户文件
func
tBakcupUser
(){
if
pub
.
Msg_YesNo
(
"是否执行一次手动备份用户文件夹。目标文件夹:"
+
pub
.
Dir_userprofile
)
==
1
{
...
...
@@ -457,9 +481,13 @@ func (mw *MyMainWindow) tHideShowIconDeal() {
return
}
if
strings
.
Index
(
r
,
"Hidden"
)
==
-
1
{
exec
.
DataBool
=
true
exec
.
Explain
=
"隐藏"
exec
.
DataBool
=
false
}
else
{
exec
.
DataBool
=
false
exec
.
Explain
=
"显示"
exec
.
DataBool
=
true
}
pub
.
SendServer
(
exec
)
...
...
wxwork/wxwork.go
View file @
850d3510
...
...
@@ -8,9 +8,6 @@ import (
"fmt"
"io/ioutil"
"wxbizmsgcrypt"
"time"
"strconv"
)
...
...
@@ -20,8 +17,10 @@ type wxXml struct {
CreateTime
uint32
`xml:"CreateTime"`
MsgType
string
`xml:"MsgType"`
Content
string
`xml:"Content"`
Msgid
string
`xml:"MsgId"`
Msgid
string
`xml:"MsgId"`
Agentid
uint32
`xml:"AgentId"`
Event
string
`xml:"Event"`
EventKey
string
`xml:"EventKey"`
}
func
main
(){
...
...
@@ -43,16 +42,18 @@ func index(w http.ResponseWriter, r *http.Request){
// 开始处理HTML
go
read
HtmlData
(
d
,
&
byteBody
)
go
parse
HtmlData
(
d
,
&
byteBody
)
// 立刻返回
fmt
.
Fprintf
(
w
,
""
)
}
func
readHtmlData
(
d
string
,
byteBody
*
[]
byte
)
string
{
func
parseHtmlData
(
d
string
,
byteBody
*
[]
byte
)
{
var
err
error
// 建立 企业微信 加密方法
wxcpt
:=
wxbizmsgcrypt
.
NewWXBizMsgCrypt
(
pub
.
W
X
TokenMsgSend
,
pub
.
WxworkEncodingAseKey
,
pub
.
WxworkReceiverId
,
wxbizmsgcrypt
.
XmlType
)
wxcpt
:=
wxbizmsgcrypt
.
NewWXBizMsgCrypt
(
pub
.
W
xwork
TokenMsgSend
,
pub
.
WxworkEncodingAseKey
,
pub
.
WxworkReceiverId
,
wxbizmsgcrypt
.
XmlType
)
// 解析 地址 参数
// ?msg_signature=5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3×tamp=1409659589&nonce=263014780&echostr=P9nAzCzyDtyTWESHep1vC5X9xho%2FqYX3Zpb4yKa9SKld1DsH3Iyt3tP3zNdtp%2B4RPcs8TgAE7OaBO%2BFZXvnaqQ%3D%3D
...
...
@@ -75,9 +76,11 @@ func readHtmlData(d string,byteBody* []byte) string {
*
byteBody
)
if
nil
!=
cryptErr
{
pub
.
PntError
(
"DecryptMsg fail"
,
cryptErr
)
return
pub
.
Error_WXWork_Down_STR
err
=
pub
.
Error_WXWork_Down
}
if
len
(
msg
)
==
0
{
err
=
pub
.
Error_WXWork_Down
}
// 解析具体消息
wxmsg
:=
ParseXML
(
&
msg
)
...
...
@@ -85,25 +88,53 @@ func readHtmlData(d string,byteBody* []byte) string {
wtBricklayer
,
err
:=
pub
.
GetWXWorkToken
()
if
err
!=
nil
{
pub
.
PntError
(
err
)
return
pub
.
Error_WXWork_Down_STR
err
=
pub
.
Error_WXWork_Down
}
// 查询 姓名
name
,
err
:=
GetBricklayerName
(
wtBricklayer
,
wxmsg
.
FromUsername
)
if
err
!=
nil
{
pub
.
PntError
(
err
)
return
pub
.
Error_WXWork_Down_STR
err
=
pub
.
Error_WXWork_Down
}
if
err
!=
nil
{
pub
.
SendWxworkTextToAUser
(
wxmsg
.
FromUsername
,
fmt
.
Sprintf
(
"%s"
,
err
))
}
// 我是复读机
if
wxmsg
.
Content
!=
""
{
pub
.
SendWxworkTextToAUser
(
wxmsg
.
FromUsername
,
wxmsg
.
Content
)
return
}
// 具体功能实现
//result := MsgDeal(&name,&wxmsg.FromUsername,&wxmsg.Content)
wxMsgDeal
(
&
name
,
&
wxmsg
.
FromUsername
,
&
wxmsg
.
Content
)
// 企业微信 消息 处理
// wxmsg.Content是接收到的文本消息ID
// wxmsg.EventKey是菜单事件
// 创建菜单调用工具:https://open.work.weixin.qq.com/wwopen/devtool/interface?doc_id=10786
// 创建菜单官方说明:https://work.weixin.qq.com/api/doc/90000/90135/90231
rec
:=
wxMsgDealEvent
(
&
name
,
&
wxmsg
.
FromUsername
,
&
wxmsg
.
EventKey
)
pub
.
SendWxworkTextToAUserWithName
(
name
,
wxmsg
.
FromUsername
,
rec
)
return
// 先回复空,再异步发送处理结果
return
""
// // 建立 回复消息模板
// xml,t,nonce := wxmsg.createXML(result)
// 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
// }
// // 加密消息
// cryptMsg, cryptErr := wxcpt.EncryptMsg(xml, t, nonce)
...
...
@@ -114,53 +145,40 @@ func readHtmlData(d string,byteBody* []byte) string {
// return string(cryptMsg)
}
func
wxMsgDeal
(
name
,
userid
,
text
*
string
)
string
{
func
wxMsgDeal
Event
(
name
,
userid
,
eventkey
*
string
)
string
{
var
result
[]
byte
var
err
error
var
wxwork
pub
.
MJwxwork
pub
.
P
rintPrefix
(
"Listen "
,
*
name
,
*
text
)
switch
*
text
{
pub
.
P
ntWxRecText
(
*
name
,
*
eventkey
)
switch
*
eventkey
{
case
"芝麻开机"
:
pub
.
SendWxworkTextToAUser
(
*
userid
,
"收到,正在处理~"
)
result
,
err
=
pub
.
SendServer
(
pub
.
GJwxworkText
(
name
,
userid
,
text
,
pub
.
Msg_Wxwork_UserWake
))
case
pub
.
WXEK_zwDevopsPowerWake
:
pub
.
SendWxworkTextToAUserWithName
(
*
name
,
*
userid
,
"收到唤醒指令,正在处理"
)
result
,
err
=
pub
.
SendServer
(
pub
.
GJwxworkText
(
name
,
userid
,
pub
.
Msg_Wxwork_UserWake
))
case
pub
.
WXEK_zwDevopsPowerTurnOFF
:
pub
.
SendWxworkTextToAUserWithName
(
*
name
,
*
userid
,
"收到关机指令,正在处理"
)
result
,
err
=
pub
.
SendServer
(
pub
.
GJwxworkText
(
name
,
userid
,
pub
.
Msg_Wxwork_TurnOFF
))
case
""
:
return
""
//
default
:
pub
.
SendWxworkTextToAUser
(
*
userid
,
*
text
)
return
""
case
pub
.
WXEK_zwDevopsPowerReboot
:
pub
.
SendWxworkTextToAUserWithName
(
*
name
,
*
userid
,
"收到重启指令,正在处理"
)
result
,
err
=
pub
.
SendServer
(
pub
.
GJwxworkText
(
name
,
userid
,
pub
.
Msg_Wxwork_Reboot
))
case
pub
.
WXEK_zwDevopsPowerStatus
:
pub
.
SendWxworkTextToAUserWithName
(
*
name
,
*
userid
,
"收到查询指令,正在处理"
)
result
,
err
=
pub
.
SendServer
(
pub
.
GJwxworkText
(
name
,
userid
,
pub
.
Msg_Wxwork_Status
))
}
if
err
!=
nil
{
return
pub
.
Error_WXWork_Down_STR
if
err
!=
nil
{
return
fmt
.
Sprintf
(
"%s"
,
err
)
}
pub
.
ParseJsonBody
(
result
,
&
wxwork
)
if
err
:=
wxwork
.
SendTextToAUser
();
err
!=
nil
{
pub
.
PntError
(
err
)
}
return
""
return
wxwork
.
Text
}
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
)
{
...
...
@@ -168,9 +186,9 @@ func ParseXML(unmsg *[]byte)wxXml{
}
return
msg
}
// 读取企业通讯录的成员信息
//官方说明:
// https://work.weixin.qq.com/api/doc/90000/90135/90196
// 官方说明: 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
)
...
...
@@ -185,4 +203,4 @@ func GetBricklayerName(token, userid string) (string,error) {
return
""
,
pub
.
Error_WXWork_Down
}
return
bi
.
Name
,
nil
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment