Commit 96c30b57 by 陶腾飞

add

parents
package main
import (
//"github.com/lxn/walk"
"AD-Control/public"
"net"
"io"
"bufio"
)
//---------------------
//
// Daemon
//
//---------------------
func daemonInit(){
if !public.Exists(public.DocuBase){
public.PrintLog("init: create Documents Base -> ",public.DocuBase)
public.Mkdir(public.DocuBase)
}
}
func deamonRun(){
daemonHost := public.Env_computername
public.PrintLog(daemonHost," Deamon Init start")
listener, err := net.Listen("tcp", public.DeamonListen)
if err != nil {
public.PrintLog("Listen Error ", err)
return
}
defer listener.Close()
for{
public.DebugLog(daemonHost," Conn Listen")
if conn, err := listener.Accept(); err == nil {
// 新建 读取流
if bmsg,cerr:= bufio.NewReader(conn).ReadBytes(public.EndSign) ; cerr != io.EOF {
// 测试消息流
public.DebugLog(string(bmsg))
// 获取ip
ip := public.GetConnIP(conn.RemoteAddr())
// 获取消息类型
msgtype := public.ParseJsonHead(bmsg)
// 处理消息
rec := public.DealMsgEnter(ip,msgtype,bmsg)
// 写入连接
conn.Write(rec)
}else{
public.PrintLog(daemonHost," Conn Read Error ", cerr)
}
// 关闭连接
if err := conn.Close() ; err!= nil{
public.PrintLog(err)
}
continue
}else{
public.PrintLog(daemonHost," Listen Error ", err)
}
}
}
func main() {
daemonInit()
deamonRun()
}
package main
// import (
// "bufio"
// "os"
// "bytes"
// "AD-Control/public"
// )
@echo off
rsrc -manifest AD-Control.manifest -o AD-Control.exe.syso
copy /y AD-Control.exe.syso ..\AD-Control-Deamon\AD-Control-Deamon.exe.syso
copy /y AD-Control.exe.syso ..\AD-Control-Users\AD-Control-Users.exe.syso
pause
\ No newline at end of file
package public
// user env ///////////////////////////////////////////////////////////////
var Env_dept string = GetEnvif("DEPT")
var Env_userprofile string = GetEnvif("USERPROFILE")
var Env_username string = GetEnvif("USERNAME")
var Env_computername string = GetEnvif("COMPUTERNAME")
var Env_homeshare string = GetEnvif("HOMESHARE")
var Env_userdomain string = GetEnvif("USERDOMAIN")
// computer env /////////////////////////////////////////////////////
const Env_FreeFileSyncExe string = `C:\Program Files (x86)\zhiwei\FreeFileSync_10.22\FreeFileSync.exe`
// AD env ///////////////////////////////////////////////////////////
const Env_MainADHostname string = "ADSERVER"
const Env_SMBAdserver string = `\\` + Env_MainADHostname + `\`
const Env_ADSoft string = Env_SMBAdserver + "software"
const Env_ADMain string = Env_SMBAdserver + "ADMAIN"
var Env_ADMainDeptShare string = Env_ADMain + `\` + Env_dept + `\` + "部门共享"
const Env_ADSfoftlike string = Env_ADSoft + `\` + "softlike"
// app env ////////////////////////////////////////////////////////////////
const Debug bool = true
const DeamonPort string = "16823"
const DeamonListen string = ":" + DeamonPort
const ADServerDeamon string = Env_MainADHostname + DeamonListen
const DocuBase string =`C:\Users\Public\Documents\AD-Control\`
// backup env //////////////////////////////////////////////////////////////
var BackupVersion string = "0416"
var BackupExtFile string = ".ffs_batch"
var BackupReplaceKey =[]byte("tengfei")
// wxwork env ///////////////////////////////////////////////////////////////
const WxworkBotLink string = `https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
//
//
//
// msg msG mSg mSG Msg MsG MSg MSG
//
//
// msg env ////////////////////////////////////////////////////////////////
const EndSign byte = 125
const msgerror string = "error"
// msg type ////////////////////////////////////////////////////////////////
const Msg_Report string = "report"
const Msg_Exec_Shutdown string = "shutdown"
const Msg_Exec_Reboot string = "reboot"
const Msg_Backup string = "backup"
// msg report type ///////////////////////////////////////////////////////////
const Msg_Report_Offwork string = "offwork"
// msg backup status //////////////////////////////////////////////////////////////
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_RunBak string = "runbak"
const Msg_Backup_Status_Over string = "over"
const Msg_Backup_Status_Error string = msgerror
// msg exec status ////////////////////////////////////////////////////////////////
const Msg_Exec_State_Request string = "request"
const Msg_Exec_State_ACK string = "ack"
// Basic Json Fromat ///////////////////////////////////////////////////////
type MJbase struct{
MsgType string `json:"msgtype"`
//MsgStatus string `json:"msgstatus"`
Username string `json:"username"`
Computername string `json:"computername"`
}
// report Json Format //////////////////////////////////////////////////////
type MJreport struct {
MJbase
Report string `json:"report"`
}
// Exec Json Fromat ///////////////////////////////////////////////////////
type MJexec struct {
MJbase
Status string `json:"status"`
Data string `json:"data"`
ExtData string `json:"extdata"`
Delay string `json:"delay"`
Explain string `json:"explain"`
}
// backup Json Format /////////////////////////////////////////////////////
type MJbackup struct{
MJbase
Status string `json:"status"`
Version string `json:"version"`
DiskFree string `json:"diskfree"`
Error bool `json:"error"`
BatchFileExist bool `json:"batchfileexist"`
BatchFileData []byte `json:"batchfiledata"`
BatchFileName string `json:"batchfilename"`
Explain string `json:"explain"`
}
package public
import(
"os/exec"
)
func Execcmd_nowait(execfile string,arge string){
PrintLog(execfile," ",arge)
exec.Command(execfile,arge).Start()
}
package public
// 消息入口
func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
var ret interface{}
switch msgtype{
// 报告 消息
case Msg_Report:
var pmsg MJreport
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
// 执行 消息
case Msg_Exec_Shutdown:
var pmsg MJexec
ParseJsonBody(unmsg,&pmsg)
//return Msg_exec_shutdown(&pmsg)
// 备份 消息
case Msg_Backup:
var pmsg MJbackup
ParseJsonBody(unmsg,&pmsg)
ret = pmsg.Msg_Deal()
}
return JsonToByte(&ret)
}
//
// 具体消息实现
//
func (rep *MJreport)Msg_Deal() interface{} {
switch rep.Report{
case Msg_Report_Offwork:
if IfPrimaryUser(rep.Username){
return GJbackup(Msg_Backup_Status_Start)
}
return nil
default:
PrintLog("Default Report Json ",rep.Report)
}
return nil
}
// func Msg_exec_shutdown(j *MJexec)interface{}{
// switch j.MsgStatus{
// case Msg_Exec_State_Request:
// return j
// case Msg_Exec_State_ACK:
// ;
// }
// return nil
// }
func (bak * MJbackup)Msg_Deal () interface{}{
switch bak.Status{
case Msg_Backup_Status_Start:
bak.Username = Env_username
bak.Computername = Env_computername
bak.Explain = "Backup Start"
bak.Status = Msg_Backup_Status_If
bak.Version = BackupVersion
bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile
//PrintLog("收集D盘剩余空间,查询主用户")
PrintLog(bak.Explain)
//如果Start可以,并且得到了主用户,判断是否有最新版本的文件和文件是否存在
if !Exists(Env_FreeFileSyncExe){
bak.Errorf("FreeFileSync hasn't been installed")
DebugLog(bak.Explain)
SendServer(bak)
return nil
}
//C:\Users\Public\Documents\AD-Control\0416tengfei.ffs_batch
if !Exists(bak.BatchFileName){
bak.BatchFileExist = false
}else{
bak.BatchFileExist = true
}
SendServer(bak)
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:
// 如果ffs的配置文件不存在 或者 是旧版本
if !bak.BatchFileExist || bak.Version != BackupVersion{
bak.BatchFileData = CreateExtTempate(&bak.Username)
bak.Version = BackupVersion
}
bak.Status = Msg_Backup_Status_RunBak
bak.Explain = "Backup Runing"
PrintLog(bak.Explain)
SendMsg(bak.Computername + DeamonListen,bak)
case Msg_Backup_Status_RunBak:
// 有新版本的话,下行赋值才有意义
bak.BatchFileName = DocuBase + bak.Version + bak.Username + BackupExtFile
if !bak.BatchFileExist{
if err := WriteBytesFile(bak.BatchFileName,bak.BatchFileData);err !=nil{
bak.Errorf("Write Batch File Error "+err.Error())
return nil
}
}
bak.Explain = "Backup Runing"
PrintLog(bak.Explain)
Execcmd_nowait(Env_FreeFileSyncExe, bak.BatchFileName)
return nil
case Msg_Backup_Status_Over:
PrintLog(" 查询文件以判断是否结束")
case Msg_Backup_Status_Error:
PrintLog(bak.Explain)
return nil
default:
PrintLog("Default Backup Json ",bak.Status)
}
return nil
}
func GJreport(s string) interface{}{
var rep MJreport
rep.init(s)
return rep
}
func GJbackup(s string)interface{}{
var rep MJbackup
rep.init(s)
return rep
}
func (bak * MJbackup)init(Status string) {
bak.Username = Env_username
bak.Computername = Env_computername
bak.MsgType = Msg_Backup
bak.Version = BackupVersion
bak.Status = Status
}
func (rep * MJreport)init(Report string) {
rep.Username = Env_username
rep.Computername = Env_computername
rep.MsgType = Msg_Report
rep.Report = Report
}
func (bak * MJbackup)Errorf(s string){
bak.Status = Msg_Backup_Status_Error
bak.Explain = "Backup Error: " + bak.Computername + " -> " + s
}
\ No newline at end of file
package public
import (
"log"
"fmt"
)
func PrintLog(v ...interface{}){
log.Println(v ...)
}
func DebugLog(v ...interface{}){
if Debug {fmt.Print("DEBUGING ");log.Println(v ...)}
}
\ No newline at end of file
package public
import (
"os"
"encoding/json"
"bytes"
"strings"
"net"
"bufio"
"io/ioutil"
)
// 获取 环境变量
// 如果空 输出错误
// 但不退出
func GetEnvif(e string) string{
r := os.Getenv(e)
DebugLog(e,"->",r)
// 获取为空
if r == "" {
PrintLog("环境错误!")
}
return r
}
// 获取 消息内容
func ParseJsonHead(b []byte)string{
//{"msgtype":"report","msgstate":"","username":"zhiweiadserver","computername":"ADSERVER","report":"下班"}
// 提取第一个冒号后的第二位和第一个逗号的前一位
// 也就是msgtype的内容
msgtype := b[bytes.IndexByte(b,':')+2:bytes.IndexByte(b,',')-1]
return string(msgtype)
}
// 解析Json 并放到变量中
func ParseJsonBody(unmsg []byte,v interface{}){
// 填写
if err := json.Unmarshal(unmsg,v) ;err != nil{
PrintLog("Parse Json Error ",err)
}
}
// Jsom 转 Byte
func JsonToByte(v interface{}) []byte{
textbyte,err := json.Marshal(v)
if err !=nil {
PrintLog("Json to String Error ",v,err)
}
return textbyte
}
// 是否存在
func Exists(path string) bool {
_, err := os.Stat(path) //os.Stat获取文件信息
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}
// 是否为文件夹
func IsDir(path string) bool {
s, err := os.Stat(path)
if err != nil {
return false
}
return s.IsDir()
}
// 是否为文件
func IsFile(path string) bool {
return !IsDir(path)
}
func Mkdir(dir string){
os.Mkdir(dir,os.ModeSetuid)
}
func WriteBytesFile(file string ,data []byte)error{
return ioutil.WriteFile(file,data,os.ModeSetuid)
}
func CreateExtTempate(dist*string) []byte {
base := BackupReplaceKey
var ret bytes.Buffer
file, err := os.Open(DocuBase + BackupVersion + "base"+BackupExtFile)
if err != nil {
PrintLog(err)
return nil
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineText := scanner.Bytes()
if bytes.Index(lineText,base) != -1 {
lineText = bytes.Replace(lineText,base, []byte(*dist),1)
}
ret.Write(lineText)
ret.Write([]byte("\n"))
}
//PrintLog(ret.String())
return ret.Bytes()
}
// 从连接中 获取ip
func GetConnIP(s net.Addr) string {
return strings.Split(s.String(),":")[0]
}
func IfPrimaryUser(s string) bool{
if strings.Index(s,"zhiwei") == -1{
return true
}
return false
}
\ No newline at end of file
package public
import (
"encoding/json"
"net"
"net/http"
"io"
"bytes"
"bufio"
)
func SendServer(v interface{})[]byte{
return SendMsg(ADServerDeamon,v)
}
func SendServerReport(s string)[]byte{
return SendServer(GJreport(s))
}
func SendMsg(you string ,v interface{})[]byte{
textbyte,err := json.Marshal(v)
if err !=nil {
PrintLog("Json to String Error ",v,err)
}
conn, err := net.Dial("tcp", you)
if err != nil {
PrintLog("err = ", err)
}
//发送数据
conn.Write(textbyte)
DebugLog(string(textbyte))
bmsg,cerr:= bufio.NewReader(conn).ReadBytes(EndSign)
var rec []byte
if cerr != io.EOF {
// 获取ip
ip := GetConnIP(conn.RemoteAddr())
// 获取消息类型
msgtype := ParseJsonHead(bmsg)
// 处理消息
rec = DealMsgEnter(ip,msgtype,bmsg)
}else{
PrintLog(Env_computername," Conn Read Error ", cerr)
}
if err := conn.Close();err !=nil{
PrintLog("Conn Close ",err)
}
return rec
}
// 发送 到 微信机器人
func SendWX(Content string){
w := []byte(`
{
"msgtype": "text",
"text": {
"content": "`+Content+`"
}
}`)
http.Post(WxworkBotLink,"application/json; charset=utf-8",bytes.NewBuffer(w))
}
\ No newline at end of file
package main
import (
"fmt"
"log"
registry "github.com/golang/sys/windows/registry"
)
func main() {
installListPath := [2]string{`SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall`,`SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall`}
for _,ilp := range installListPath{
k, kerr := registry.OpenKey(registry.LOCAL_MACHINE,ilp, registry.READ)
if kerr != nil {
log.Fatal(kerr)
}
defer k.Close()
il,ilerr := k.ReadSubKeyNames(0)
if ilerr != nil{
log.Fatal(ilerr)
}
for _,each := range il{
subil := ilp + `\` + each
sk, skerr := registry.OpenKey(registry.LOCAL_MACHINE,subil, registry.READ)
if skerr != nil{
fmt.Print(skerr)
}
dn, _, skerr := sk.GetStringValue("DisplayName")
us, _, userr := sk.GetStringValue("UninstallString")
if skerr != nil || userr!=nil{
continue
}
fmt.Printf("%s,%s\n", dn,us)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv1:assemblyIdentity name="AD-Control-Users..exe" version="0.0.0.1" publicKeyToken="0000000000000000" language="非特定语言" processorArchitecture="msil" type="win32" />
<description asmv2:publisher="知微" asmv2:product="域控制中心" xmlns="urn:schemas-microsoft-com:asm.v1" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
</windowsSettings>
</application>
</assembly>
\ No newline at end of file
package main
import (
"AD-Control/public"
"net/http"
"bytes"
)
func main() {
Content := "Golang Text Bot"
}
\ No newline at end of file
@echo off
cd C:\Users\Administrator\go\src\AD-Control\users
rsrc -manifest .\users.exe.manifest -ico ..\public\AD-Control.ico -o .\users.exe.syso
pause
\ No newline at end of file
package main
import (
"github.com/lxn/walk"
"io/ioutil"
"AD-Control/public"
"strings"
"os/exec"
)
//---------------------------------------------------------
//
// Power
//
//---------------------------------------------------------
func menuInitPower(ni * walk.NotifyIcon){
fa := "电源"
sub := [...]string{"下班咯","关闭系统","用户注销","重启系统"}
// 建立空菜单
nm,err := walk.NewMenu()
if err != nil {
public.PrintLog(err)
}
for i,buttonText := range sub{
// 建立 子按钮
na := walk.NewAction()
if err := na.SetText(buttonText); err != nil {
public.PrintLog(err)
}
// 为子按钮 添加事件
switch i{
case 0:
na.Triggered().Attach(pWorkOff)
case 1:
na.Triggered().Attach(pCloseWindows)
case 3:
na.Triggered().Attach(pLogOffUser)
case 4:
na.Triggered().Attach(pRebootComputer)
}
// 将 子按钮 添加到 菜单
nm.Actions().Add(na)
}
//将菜单添加到托盘
sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
if err != nil {
public.PrintLog(err)
}
// 主菜单 属性
sysmenu.SetText(fa)
sysmenu.SetVisible(true)
sysmenu.SetEnabled(true)
}
func pWorkOff(){
public.SendServerReport(public.Msg_Report_Offwork)
}
func pCloseWindows(){
//public.SendServerReport(public.Msg_Report_Offwork)
public.PrintLog("关闭系统")
}
func pLogOffUser(){
public.PrintLog("注销用户")
}
func pRebootComputer(){
public.PrintLog("重启主机")
}
//--------------------------------------------------------------------
//
// Software Install
//
//--------------------------------------------------------------------
func menuInitSoftwareInstall(ni * walk.NotifyIcon){
fa := "软件安装"
// 建立空菜单
nm,err := walk.NewMenu()
if err != nil {
public.PrintLog(err)
}
list,err := ioutil.ReadDir(public.Env_ADSfoftlike)
if err != nil {
public.PrintLog(err)
}
for _,ueach := range list{
each := ueach.Name()
if each == ".DS_Store"{
continue
}
each_noext := strings.TrimSuffix(strings.TrimSuffix(ueach.Name(),".exe"),".msi")
// 建立 子按钮
na := walk.NewAction()
if err := na.SetText(each_noext); err != nil {
public.PrintLog(err)
}
// 为子按钮 添加事件
na.Triggered().Attach(func() {
siEnter_admin(each)
})
// 将 子按钮 添加到 菜单
nm.Actions().Add(na)
}
//将菜单添加到托盘
sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
if err != nil {
public.PrintLog(err)
}
// 主菜单 属性
sysmenu.SetText(fa)
sysmenu.SetVisible(true)
sysmenu.SetEnabled(true)
}
func siEnter_admin(soft string){
cmd := exec.Command(public.Env_ADSfoftlike + `\` + soft)
cmd.Start()
}
//---------------------------------------------------------------
//
// User Tools
//
//---------------------------------------------------------------
func menuInitUserTools(ni * walk.NotifyIcon){
fa := "用户工具"
sub := [...]string{"部门共享连接微盘","桌面文件连接微盘","隐藏桌面图标","恢复桌面图标"}
// 建立空菜单
nm,err := walk.NewMenu()
if err != nil {
public.PrintLog(err)
}
for i,buttonText := range sub{
// 建立 子按钮
na := walk.NewAction()
if err := na.SetText(buttonText); err != nil {
public.PrintLog(err)
}
// 为子按钮 添加事件
switch i{
case 0:
na.Triggered().Attach(func(){utDeptLinkWxPan();return})
case 1:
na.Triggered().Attach(utDesktopLinkWxPan)
case 2:
na.Triggered().Attach(utHideIcon)
case 3:
na.Triggered().Attach(utShowIcon)
}
// 将 子按钮 添加到 菜单
nm.Actions().Add(na)
}
//将菜单添加到托盘
sysmenu,err := ni.ContextMenu().Actions().AddMenu(nm)
if err != nil {
public.PrintLog(err)
}
// 主菜单 属性
sysmenu.SetText(fa)
sysmenu.SetVisible(true)
sysmenu.SetEnabled(true)
}
func utDeptLinkWxPan(){
public.PrintLog("部门共享连接微盘")
}
func utDesktopLinkWxPan(){
public.PrintLog("桌面文件连接微盘")
}
func utHideIcon(){
public.PrintLog("隐藏图标")
}
func utShowIcon(){
public.PrintLog("显示图标")
}
//---------------------------------------------------------------
//
// file share
//
//---------------------------------------------------------------
func menuInitFileShares(ni * walk.NotifyIcon){
// envhs := os.Getenv("HOMESHARE")
// public.PrintLog(envhs)
fa := "文件共享"
// sub := [...]string{"部门共享连接微盘","隐藏桌面图标","恢复桌面图标"}
// // 建立空菜单
mfs,err := walk.NewMenu()
if err != nil {
public.PrintLog(err)
}
deptList,err := ioutil.ReadDir(public.Env_ADMain)
if err !=nil {
public.PrintLog(err)
}
for _,memberList := range deptList {
nm,err := walk.NewMenu()
if err != nil {
public.PrintLog(err)
}
deptshare := memberList.Name()
member,err := ioutil.ReadDir(public.Env_ADMain + `\` + deptshare)
if err != nil {
public.PrintLog(err)
}
for _,mem := range member{
wokrer := mem.Name()
// 建立 子按钮
na := walk.NewAction()
if err := na.SetText(strings.TrimSuffix(wokrer,".lnk")); err != nil {
public.PrintLog(err)
}
// 为子按钮 添加事件
na.Triggered().Attach(func(){fsOpenWindow(public.Env_ADMain + `\` + deptshare + `\` + wokrer);return})
// 将 子按钮 添加到 菜单
nm.Actions().Add(na)
}
if m,err := mfs.Actions().AddMenu(nm);err != nil{
public.PrintLog(err)
}else{
m.SetText(deptshare)
m.SetVisible(true)
m.SetEnabled(true)
}
}
//将菜单添加到托盘
sysmenu,err := ni.ContextMenu().Actions().AddMenu(mfs)
if err != nil {
public.PrintLog(err)
}
// 主菜单 属性
sysmenu.SetText(fa)
sysmenu.SetVisible(true)
sysmenu.SetEnabled(true)
}
func fsOpenWindow(s string){
public.PrintLog(s)
exec.Command("explorer",s).Start()
}
\ No newline at end of file
taskkill /f /im users.exe
go build -ldflags="-H windowsgui"
start ./users.exe
\ No newline at end of file
File added
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<asmv1:assemblyIdentity name="AD-Control-Users..exe" version="0.0.0.1" publicKeyToken="0000000000000000" language="非特定语言" processorArchitecture="msil" type="win32" />
<description asmv2:publisher="知微" asmv2:product="域控制中心" xmlns="urn:schemas-microsoft-com:asm.v1" />
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
</windowsSettings>
</application>
</assembly>
\ No newline at end of file
// Copyright 2011 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"github.com/lxn/walk"
"AD-Control/public"
)
func menuInit(ni * walk.NotifyIcon){
menuInitPower(ni)
menuInitSoftwareInstall(ni)
menuInitUserTools(ni)
menuInitFileShares(ni)
}
func userappInit(){
}
func main() {
//adserver := public.ADServerDeamon
public.SendServerReport("Start User")
userappInit()
mw, err := walk.NewMainWindow()
if err != nil {
public.PrintLog(err)
}
// We load our icon from a file.
icon, err := walk.Resources.Icon(`AD-Control.ico`)
//icon, err := walk.Resources.Icon(`C:\Windows\SystemApps\Microsoft.Windows.SecHealthUI_cw5n1h2txyewy\Assets\Account.theme-light.ico`)
if err != nil {
public.PrintLog(err)
}
// Create the notify icon and make sure we clean it up on exit.
ni, err := walk.NewNotifyIcon(mw)
if err != nil {
public.PrintLog(err)
}
defer ni.Dispose()
// Set the icon and a tool tip text.
if err := ni.SetIcon(icon); err != nil {
public.PrintLog(err)
}
if err := ni.SetToolTip("Click for info or use the context menu to exit."); err != nil {
public.PrintLog(err)
}
menuInit(ni)
// The notify icon is hidden initially, so we have to make it visible.
if err := ni.SetVisible(true); err != nil {
public.PrintLog(err)
}
// Run the message loop.
mw.Run()
}
func close(){
public.PrintLog("触发关闭")
}
\ No newline at end of file
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