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
83984473
Commit
83984473
authored
May 11, 2020
by
陶腾飞
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
4620e4e1
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
122 additions
and
36 deletions
+122
-36
adct/adct.exe
+0
-0
adct/adct.go
+4
-3
daemon/daemon.exe
+0
-0
public/env.go
+49
-18
public/msg_deal.go
+30
-2
public/msg_init.go
+4
-1
public/public.go
+8
-1
public/reg.go
+0
-5
public/win.go
+14
-5
users/menu.go
+13
-1
users/users.exe
+0
-0
No files found.
adct/adct.exe
View file @
83984473
No preview for this file type
adct/adct.go
View file @
83984473
...
@@ -11,7 +11,7 @@ func main(){
...
@@ -11,7 +11,7 @@ func main(){
var
reportText
=
flag
.
String
(
public
.
Msg_Report
,
""
,
"report to AD"
)
var
reportText
=
flag
.
String
(
public
.
Msg_Report
,
""
,
"report to AD"
)
var
backupText
=
flag
.
String
(
public
.
Msg_Backup
,
""
,
"backup status to AD"
)
var
backupText
=
flag
.
String
(
public
.
Msg_Backup
,
""
,
"backup status to AD"
)
var
execText
=
flag
.
String
(
public
.
Msg_Exec
,
""
,
"exec to LocalDaemon"
)
var
execText
=
flag
.
String
(
public
.
Msg_Exec
,
""
,
"exec to LocalDaemon"
)
var
userText
=
flag
.
String
(
public
.
Msg_User
,
""
,
"who is running me"
)
var
userText
=
flag
.
String
(
"user"
,
""
,
"who is running me"
)
var
wolmacText
=
flag
.
String
(
"wolmac"
,
""
,
"input mac address for wake pc"
)
var
wolmacText
=
flag
.
String
(
"wolmac"
,
""
,
"input mac address for wake pc"
)
var
woluserText
=
flag
.
String
(
"woluser"
,
""
,
"input name for walk pc"
)
var
woluserText
=
flag
.
String
(
"woluser"
,
""
,
"input name for walk pc"
)
var
hourText
=
flag
.
Bool
(
"hour"
,
false
,
"exec task at the time"
)
var
hourText
=
flag
.
Bool
(
"hour"
,
false
,
"exec task at the time"
)
...
@@ -50,9 +50,10 @@ func flag_hour(){
...
@@ -50,9 +50,10 @@ func flag_hour(){
nh
:=
time
.
Now
()
.
Hour
()
nh
:=
time
.
Now
()
.
Hour
()
public
.
PrintLog
(
nh
)
public
.
PrintLog
(
nh
)
switch
nh
{
switch
nh
{
case
0
:
case
0
:
public
.
MsgBox
(
`5分钟后,即将
重启
,运行Z:\tools\【工具】取消关机.bat`
)
public
.
MsgBox
(
`5分钟后,即将
关机
,运行Z:\tools\【工具】取消关机.bat`
)
public
.
Execcmd_nowait
(
"shutdown -
r
-t 300"
)
public
.
Execcmd_nowait
(
"shutdown -
s
-t 300"
)
break
break
case
1
:
case
1
:
public
.
MsgBox
(
`5分钟后,即将重启,运行Z:\tools\【工具】取消关机.bat`
)
public
.
MsgBox
(
`5分钟后,即将重启,运行Z:\tools\【工具】取消关机.bat`
)
...
...
daemon/daemon.exe
View file @
83984473
No preview for this file type
public/env.go
View file @
83984473
...
@@ -28,9 +28,7 @@ var User_sessionID string = Reg_query_item_one(HKU,User_sid+`\Volatile Envi
...
@@ -28,9 +28,7 @@ var User_sessionID string = Reg_query_item_one(HKU,User_sid+`\Volatile Envi
// win-computer env /////////////////////////////////////////////////////
// win-computer env /////////////////////////////////////////////////////
const
Env_FreeFileSyncExe
string
=
`C:\Progra~2\zhiwei\FreeFileSync_10.22\FreeFileSync.exe`
const
Env_FreeFileSyncExe
string
=
`C:\Progra~2\zhiwei\FreeFileSync_10.22\FreeFileSync.exe`
const
HKCU
string
=
"HKCU"
const
HKLM
string
=
"HKLM"
const
HKU
string
=
"HKU"
// AD env ///////////////////////////////////////////////////////////
// AD env ///////////////////////////////////////////////////////////
...
@@ -54,7 +52,6 @@ var BackupExtFile string = ".ffs_batch"
...
@@ -54,7 +52,6 @@ var BackupExtFile string = ".ffs_batch"
var
BackupReplaceKey
=
[]
byte
(
"-tengfei-"
)
var
BackupReplaceKey
=
[]
byte
(
"-tengfei-"
)
// other env ///////////////////////////////////////////////////////////////
// other env ///////////////////////////////////////////////////////////////
const
Link_WxworkBot
string
=
`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
const
Link_WxworkBot
string
=
`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=59107f72-5b72-4a20-a33c-fdb1cd46f2c6`
...
@@ -62,6 +59,29 @@ const Link_MultiSplit string = Env_ADApplication + "win_MultiSplit.exe"
...
@@ -62,6 +59,29 @@ const Link_MultiSplit string = Env_ADApplication + "win_MultiSplit.exe"
const
Cmdk
string
=
"cmd /k "
const
Cmdk
string
=
"cmd /k "
const
Startk
string
=
"cmd /k start "
const
Startk
string
=
"cmd /k start "
var
Dir_Windows
string
=
GetEnv
(
"windir"
)
+
`\`
var
Dir_Windows
string
=
GetEnv
(
"windir"
)
+
`\`
// 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"
// reg ////////////////////////////////////////////////////////////////////
const
(
HKCU
=
iota
HKLM
HKU
)
const
Reg_Root_achome
int
=
HKLM
const
Reg_Path_achome
string
=
`SOFTWARE\ADControl`
const
Reg_Path_achome_dc
string
=
Reg_Path_achome
+
`\DomainComputer\`
const
Reg_Name_achome_dc_lastlogin
string
=
"LastLogin"
const
Reg_Name_achome_dc_lastclose
string
=
"CloseWindows"
//
//
//
//
//
//
...
@@ -81,8 +101,7 @@ const msgerror string = "error"
...
@@ -81,8 +101,7 @@ 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"
const
Msg_reg
string
=
"reg"
// msg report type ///////////////////////////////////////////////////////////
// msg report type ///////////////////////////////////////////////////////////
...
@@ -90,7 +109,7 @@ const Msg_Report_DaemonStart string = "Daemon Start"
...
@@ -90,7 +109,7 @@ const Msg_Report_DaemonStart string = "Daemon Start"
const
Msg_Report_UserStart
string
=
"User 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"
const
Msg_Report_CloseWindows
string
=
"closewindows"
// msg backup status //////////////////////////////////////////////////////////////
// msg backup status //////////////////////////////////////////////////////////////
...
@@ -103,9 +122,11 @@ const Msg_Backup_Status_Error string = msgerror
...
@@ -103,9 +122,11 @@ const Msg_Backup_Status_Error string = msgerror
// msg exec status ////////////////////////////////////////////////////////////////
// msg exec status ////////////////////////////////////////////////////////////////
const
Msg_Exec_Cmder_ADServer
int
=
0
const
(
const
Msg_Exec_Cmder_LocalDaemon
int
=
1
Msg_Exec_Cmder_ADServer
=
iota
const
Msg_Exec_Cmder_LocalUser
int
=
2
Msg_Exec_Cmder_LocalDaemon
Msg_Exec_Cmder_LocalUser
)
const
Msg_Exec_State_Request
string
=
"request"
const
Msg_Exec_State_Request
string
=
"request"
const
Msg_Exec_State_Ack
string
=
"ack"
const
Msg_Exec_State_Ack
string
=
"ack"
const
Msg_Exec_CloseWindows
string
=
"closewindow"
const
Msg_Exec_CloseWindows
string
=
"closewindow"
...
@@ -121,8 +142,13 @@ const Msg_Exec_UpdateVersion string = "updateverion"
...
@@ -121,8 +142,13 @@ const Msg_Exec_UpdateVersion string = "updateverion"
const
Msg_Exec_UpdateVersion_cmd
string
=
"Env_ADSoftTool_Update"
const
Msg_Exec_UpdateVersion_cmd
string
=
"Env_ADSoftTool_Update"
const
Msg_Exec_InstallSoftware
string
=
"installsoftware"
const
Msg_Exec_InstallSoftware
string
=
"installsoftware"
const
(
Msg_Reg_Query
=
iota
Msg_Reg_Read
)
//const Msg_Reg_
// group
msg
////
// group
Json
////
// Basic Json Fromat ///////////////////////////////////////////////////////
// Basic Json Fromat ///////////////////////////////////////////////////////
type
MJbase
struct
{
type
MJbase
struct
{
...
@@ -131,6 +157,7 @@ type MJbase struct{
...
@@ -131,6 +157,7 @@ type MJbase struct{
Explain
string
`json:"explain"`
Explain
string
`json:"explain"`
Username
string
`json:"username"`
Username
string
`json:"username"`
Computername
string
`json:"computername"`
Computername
string
`json:"computername"`
Timestamp
int64
`json:"timestamp"`
}
}
// report Json Format //////////////////////////////////////////////////////
// report Json Format //////////////////////////////////////////////////////
...
@@ -162,10 +189,14 @@ type MJbackup struct{
...
@@ -162,10 +189,14 @@ type MJbackup struct{
BatchFileData
[]
byte
`json:"batchfiledata"`
BatchFileData
[]
byte
`json:"batchfiledata"`
BatchFileName
string
`json:"batchfilename"`
BatchFileName
string
`json:"batchfilename"`
}
}
type
MJreg
struct
{
MJbase
Action
int
`json:"action"`
Root
int
`json:"root"`
Path
string
`json:"path"`
Key
string
`json:"key"`
DataStr
string
`json:"datastr"`
DataType
int
`json:"datatype"`
DataBool
string
`json:"databool"`
}
// AD User ////////////////////////////////////////////////////////////////
\ No newline at end of file
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
public/msg_deal.go
View file @
83984473
...
@@ -25,6 +25,13 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
...
@@ -25,6 +25,13 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
var
pmsg
MJbackup
var
pmsg
MJbackup
ParseJsonBody
(
unmsg
,
&
pmsg
)
ParseJsonBody
(
unmsg
,
&
pmsg
)
ret
=
pmsg
.
Msg_Deal
()
ret
=
pmsg
.
Msg_Deal
()
// 注册表 消息
case
Msg_reg
:
var
pmsg
MJreg
ParseJsonBody
(
unmsg
,
&
pmsg
)
ret
=
pmsg
.
Msg_Deal
()
}
}
return
JsonToByte
(
&
ret
)
return
JsonToByte
(
&
ret
)
...
@@ -39,6 +46,7 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
...
@@ -39,6 +46,7 @@ func DealMsgEnter(ip string,msgtype string,unmsg []byte) []byte {
// 关于 report 报告 的 消息处理
// 关于 report 报告 的 消息处理
func
(
rep
*
MJreport
)
Msg_Deal
()
interface
{}
{
func
(
rep
*
MJreport
)
Msg_Deal
()
interface
{}
{
PrintLog
(
rep
)
switch
rep
.
Report
{
switch
rep
.
Report
{
case
Msg_Report_Offwork
:
case
Msg_Report_Offwork
:
...
@@ -48,8 +56,21 @@ func (rep *MJreport)Msg_Deal() interface{} {
...
@@ -48,8 +56,21 @@ func (rep *MJreport)Msg_Deal() interface{} {
SysMsgBox
(
rep
.
Computername
,
"备份结束"
)
SysMsgBox
(
rep
.
Computername
,
"备份结束"
)
return
GJexecAck
(
Msg_Exec_CloseWindows
)
return
GJexecAck
(
Msg_Exec_CloseWindows
)
case
Msg_Report_UserStart
:
case
Msg_Report_CloseWindows
:
Reg_Write_key_one
(
Reg_Root_achome
,
Reg_Path_achome_dc
+
rep
.
Computername
,
Reg_Name_achome_dc_lastclose
,
UnixTimeParse
(
&
rep
.
Timestamp
))
case
Msg_Report_DaemonStart
:
case
Msg_Report_DaemonStart
:
Reg_Write_key_one
(
Reg_Root_achome
,
Reg_Path_achome_dc
+
rep
.
Computername
,
Reg_Name_achome_dc_lastlogin
,
UnixTimeParse
(
&
rep
.
Timestamp
))
case
Msg_Report_UserStart
:
if
rep
.
Version
!=
Version
{
if
rep
.
Version
!=
Version
{
return
GJexecAck
(
Msg_Exec_UpdateVersion
)
return
GJexecAck
(
Msg_Exec_UpdateVersion
)
}
}
...
@@ -57,7 +78,6 @@ func (rep *MJreport)Msg_Deal() interface{} {
...
@@ -57,7 +78,6 @@ func (rep *MJreport)Msg_Deal() interface{} {
PrintLog
(
"Default Report Json "
,
rep
.
Report
)
PrintLog
(
"Default Report Json "
,
rep
.
Report
)
}
}
return
nil
return
nil
}
}
...
@@ -213,4 +233,11 @@ func (bak * MJbackup)Msg_Deal() interface{}{
...
@@ -213,4 +233,11 @@ func (bak * MJbackup)Msg_Deal() interface{}{
}
}
func
(
reg
*
MJreg
)
Msg_Deal
()
interface
{}{
switch
reg
.
Action
{
case
Msg_Reg_Query
:
reg
.
DataStr
=
Reg_query_key_one
(
reg
.
Root
,
reg
.
Path
,
reg
.
Key
)
}
return
reg
}
\ No newline at end of file
public/msg_init.go
View file @
83984473
...
@@ -16,7 +16,7 @@ func GJreport(s string,who string) interface{}{
...
@@ -16,7 +16,7 @@ func GJreport(s string,who string) interface{}{
func
(
rep
*
MJreport
)
init
(
Report
string
)
{
func
(
rep
*
MJreport
)
init
(
Report
string
)
{
rep
.
Username
=
User_name
rep
.
Username
=
User_name
rep
.
Username
=
User_name
rep
.
Timestamp
=
NowTimestamp
()
rep
.
Computername
=
User_computername
rep
.
Computername
=
User_computername
rep
.
MsgType
=
Msg_Report
rep
.
MsgType
=
Msg_Report
rep
.
Report
=
Report
rep
.
Report
=
Report
...
@@ -60,6 +60,7 @@ func GJexecUserCmd(s string) interface{}{
...
@@ -60,6 +60,7 @@ func GJexecUserCmd(s string) interface{}{
func
(
exec
*
MJexec
)
init
(
s
string
){
func
(
exec
*
MJexec
)
init
(
s
string
){
exec
.
Username
=
User_name
exec
.
Username
=
User_name
exec
.
Computername
=
User_computername
exec
.
Computername
=
User_computername
exec
.
Timestamp
=
NowTimestamp
()
exec
.
MsgType
=
Msg_Exec
exec
.
MsgType
=
Msg_Exec
exec
.
Instruction
=
s
exec
.
Instruction
=
s
exec
.
SessionID
=
User_sessionID
exec
.
SessionID
=
User_sessionID
...
@@ -67,6 +68,7 @@ func (exec * MJexec)init(s string){
...
@@ -67,6 +68,7 @@ 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
.
Timestamp
=
NowTimestamp
()
}
}
...
@@ -78,6 +80,7 @@ func GJbackup()interface{}{
...
@@ -78,6 +80,7 @@ func GJbackup()interface{}{
return
rep
return
rep
}
}
func
(
bak
*
MJbackup
)
init
()
{
func
(
bak
*
MJbackup
)
init
()
{
bak
.
Timestamp
=
NowTimestamp
()
bak
.
MsgType
=
Msg_Backup
bak
.
MsgType
=
Msg_Backup
bak
.
Version
=
BackupVersion
bak
.
Version
=
BackupVersion
bak
.
Status
=
Msg_Backup_Status_Start
bak
.
Status
=
Msg_Backup_Status_Start
...
...
public/public.go
View file @
83984473
...
@@ -188,9 +188,15 @@ func GetNewestDir(rdir ,extdir string) string {
...
@@ -188,9 +188,15 @@ func GetNewestDir(rdir ,extdir string) string {
func
HasSuffix
(
str
*
string
,
sub
string
)
bool
{
func
HasSuffix
(
str
*
string
,
sub
string
)
bool
{
return
strings
.
HasSuffix
(
*
str
,
sub
)
return
strings
.
HasSuffix
(
*
str
,
sub
)
}
}
fu
cn
TrimSuffix
(
str
,
s
string
)
string
{
fu
nc
TrimSuffix
(
str
,
s
string
)
string
{
return
strings
.
TrimSuffix
(
str
,
s
)
return
strings
.
TrimSuffix
(
str
,
s
)
}
}
func
Exit
(){
func
Exit
(){
os
.
Exit
(
0
)
os
.
Exit
(
0
)
}
}
func
NowTimestamp
()
int64
{
return
time
.
Now
()
.
Unix
()
}
func
UnixTimeParse
(
t
*
int64
)
string
{
return
time
.
Unix
(
*
t
,
0
)
.
String
()
}
\ No newline at end of file
public/reg.go
deleted
100644 → 0
View file @
4620e4e1
package
public
import
(
"reg"
)
public/win.go
View file @
83984473
...
@@ -106,7 +106,7 @@ func SysMsgBox(pc,message string){
...
@@ -106,7 +106,7 @@ func SysMsgBox(pc,message string){
//
//
// regedit
// regedit
//
//
func
reg_prase
(
root
*
string
)
registry
.
Key
{
func
reg_prase
(
root
*
int
)
registry
.
Key
{
switch
*
root
{
switch
*
root
{
case
HKCU
:
case
HKCU
:
return
registry
.
CURRENT_USER
return
registry
.
CURRENT_USER
...
@@ -117,9 +117,7 @@ func reg_prase(root * string) registry.Key{
...
@@ -117,9 +117,7 @@ func reg_prase(root * string) registry.Key{
}
}
return
registry
.
LOCAL_MACHINE
return
registry
.
LOCAL_MACHINE
}
}
func
Reg_query_item_one
(
root
,
path
string
)
string
{
func
Reg_query_item_one
(
root
int
,
path
string
)
string
{
PrintLog
(
root
,
`\`
,
path
)
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
);
kerr
==
nil
{
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
);
kerr
==
nil
{
defer
k
.
Close
()
defer
k
.
Close
()
if
sk
,
err
:=
k
.
ReadSubKeyNames
(
1
);
err
==
nil
{
if
sk
,
err
:=
k
.
ReadSubKeyNames
(
1
);
err
==
nil
{
...
@@ -133,7 +131,7 @@ func Reg_query_item_one(root ,path string) string {
...
@@ -133,7 +131,7 @@ func Reg_query_item_one(root ,path string) string {
return
""
return
""
}
}
}
}
func
Reg_query_key_one
(
root
,
path
,
key
string
)
string
{
func
Reg_query_key_one
(
root
int
,
path
,
key
string
)
string
{
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
);
kerr
==
nil
{
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
READ
);
kerr
==
nil
{
defer
k
.
Close
()
defer
k
.
Close
()
if
sk
,
_
,
err
:=
k
.
GetStringValue
(
key
);
err
==
nil
{
if
sk
,
_
,
err
:=
k
.
GetStringValue
(
key
);
err
==
nil
{
...
@@ -148,3 +146,13 @@ func Reg_query_key_one(root, path, key string) string {
...
@@ -148,3 +146,13 @@ func Reg_query_key_one(root, path, key string) string {
return
""
return
""
}
}
}
}
func
Reg_Write_key_one
(
root
int
,
path
,
name
,
value
string
)
{
if
k
,
kerr
:=
registry
.
OpenKey
(
reg_prase
(
&
root
),
path
,
registry
.
WRITE
);
kerr
==
nil
{
defer
k
.
Close
()
if
err
:=
k
.
SetStringValue
(
name
,
value
);
err
!=
nil
{
PrintLog
(
err
)
}
}
else
{
PrintLog
(
kerr
)
}
}
\ No newline at end of file
users/menu.go
View file @
83984473
...
@@ -134,7 +134,7 @@ func siEnter_admin(softname string){
...
@@ -134,7 +134,7 @@ func siEnter_admin(softname string){
// WxDrive Sync
// WxDrive Sync
//
//
//---------------------------------------------------------------
//---------------------------------------------------------------
func
menuInitWxDriveSync
(
ni
){
func
menuInitWxDriveSync
(
ni
*
walk
.
NotifyIcon
){
fa
:=
"用户工具"
fa
:=
"用户工具"
sub
:=
[
...
]
string
{
"初始化"
,
"开启服务器同步到微盘"
,
"开启微盘同步到服务器"
,
"说明"
}
sub
:=
[
...
]
string
{
"初始化"
,
"开启服务器同步到微盘"
,
"开启微盘同步到服务器"
,
"说明"
}
// 建立空菜单
// 建立空菜单
...
@@ -179,6 +179,18 @@ func menuInitWxDriveSync(ni){
...
@@ -179,6 +179,18 @@ func menuInitWxDriveSync(ni){
sysmenu
.
SetEnabled
(
true
)
sysmenu
.
SetEnabled
(
true
)
}
}
func
wxdsInit
(){
func
wxdsInit
(){
public
.
Msg
(
"开发ing"
)
}
func
wxdsToDrive
(){
public
.
Msg
(
"开发ing"
)
}
func
wxdsToServer
(){
public
.
Msg
(
"开发ing"
)
}
func
wxdsExplain
(){
public
.
Msg
(
"开发ing"
)
}
}
//---------------------------------------------------------------
//---------------------------------------------------------------
...
...
users/users.exe
View file @
83984473
No preview for this file type
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