一.背景信息

在我们的安全运维工作中经常需要进行安全基线配置和检查,所谓的安全基线配置就是系统的最基础的安全配置,安全基线检查涉及操作系统、中间件、数据库、甚至是交换机等网络基础设备的检查,面对如此繁多的检查项,自动化的脚本可以帮助我们快速地完成基线检查的任务,如下为基线检测脚本具体的内容,供大家学习参考

二.基线检测脚本

<#
# Windows操作系统安全加固基线检测脚本
#>
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
$data = @{"project"=@()}
secedit /export /cfg config.cfg /quiet #guest停用策略 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "EnableGuestAccount ")){
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "1")
{
$data.code = "1"
$projectdata = @{"msg"="guest账户停用策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="guest账户停用策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#guest重命名策略 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "NewGuestName "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "Guest")
{
$data.code = "1"
$projectdata = @{"msg"="guest账户重命名策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="guest账户重命名策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#密码复杂性策略
$config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "PasswordComplexity "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "1")
{
$data.code = "1"
$projectdata = @{"msg"="密码复杂性策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="密码复杂性策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#密码长度最小值策略
$config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "MinimumPasswordLength "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -ge "8")
{
$data.code = "1"
$projectdata = @{"msg"="密码最小值策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="密码最小值策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#密码最长使用期限策略 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "MaximumPasswordAge "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -le "90")
{
$data.code = "1"
$projectdata = @{"msg"="密码最长使用期限策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="密码最长使用期限策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#账户锁定阀值策略 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "LockoutBadCount "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -le "5")
{
$data.code = "1"
$projectdata = @{"msg"="账户锁定阀值策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="账户锁定阀值策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#账户锁定时间策略 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "ResetLockoutCount "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -ge "10")
{
$data.code = "1"
$projectdata = @{"msg"="账户锁定时间策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="账户锁定时间策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#关闭系统仅Administrator策略
$config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "ResetLockoutCount "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -ge "10")
{
$data.code = "1"
$projectdata = @{"msg"="账户锁定时间策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="账户锁定时间策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#操作系统远程关机策略安全 $config = Get-Content -path config.cfg for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "SeRemoteShutdownPrivilege "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "*S-1-5-32-544")
{
$data.code = "1"
$projectdata = @{"msg"="操作系统远程关机策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="操作系统远程关机策略不符合标准";
}
$data['project']+=$projectdata
}
}
}

#操作系统本地关机策略安全 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "SeShutdownPrivilege "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "*S-1-5-32-544")
{
$data.code = "1"
$projectdata = @{"msg"="操作系统本地关机策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="操作系统本地关机策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#取得文件或其他对象的所有权限策略
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "SeProfileSingleProcessPrivilege "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "*S-1-5-32-544")
{
$data.code = "1"
$projectdata = @{"msg"="取得文件或其他对象的所有权限策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="取得文件或其他对象的所有权限策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#从网络访问此计算机策略
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "SeNetworkLogonRight "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "*S-1-5-32-544,*S-1-5-32-545,*S-1-5-32-551")
{
$data.code = "1"
$projectdata = @{"msg"="从网络访问此计算机策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="从网络访问此计算机策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#审核策略更改 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditSystemEvents "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核策略更改策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核策略更改策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#审核登录事件 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditLogonEvents "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核登录事件策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核登录事件不符合标准";}
$data['project']+=$projectdata
}
}
}

#审核对象访问 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditObjectAccess "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核对象访问策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核对象访问不符合标准";}
$data['project']+=$projectdata
}
}
}


#审核进程跟踪 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditProcessTracking "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "2")
{
$data.code = "1"
$projectdata = @{"msg"="审核进程跟踪策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核进程跟踪策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#审核目录服务访问 $config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditDSAccess "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核目录服务访问策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核目录服务访问策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#审核特权使用
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditPrivilegeUse "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核特权使用策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核特权使用策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#审核系统事件
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditSystemEvents "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "3")
{
$data.code = "1"
$projectdata = @{"msg"="审核系统事件策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核系统事件策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#审核账户登录事件
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditAccountLogon "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "2")
{
$data.code = "1"
$projectdata = @{"msg"="审核账户登录事件策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核账户登录事件策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#审核账户管理
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "AuditAccountManage "))
{
$config_line[1] = $config_line[1].Trim(' ')
if($config_line[1] -eq "2")
{
$data.code = "1"
$projectdata = @{"msg"="审核账户管理策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="审核账户管理策略不符合标准";}
$data['project']+=$projectdata
}
}
}

#暂停会话前所需的空闲时间
$config = Get-Content -path config.cfg
for ($i=0; $i -lt $config.Length; $i++)
{
$config_line = $config[$i] -split "="
if(($config_line[0] -eq "MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters\AutoDisconnect"))
{
$config_line = $config_line[1]
$config_line = $config[$i] -split "," if($config_line[1] -le "30")
{
$data.code = "1"
$projectdata = @{"msg"="暂停会话前所需的空闲时间策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="暂停会话前所需的空闲时间策略不符合标准";}
$data['project']+=$projectdata
}
}
}


#是否启用NTP服务同步时钟
$Key = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer'
$Name = 'Enabled'
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$Name
if($config -eq "1")
{
$data.code = "1"
$projectdata = @{"msg"="启用NTP服务同步时钟策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="启用NTP服务同步时钟策略不符合标准";}
$data['project']+=$projectdata
}


#检测开机启动项
$Key = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run'
$result = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop)
$projectdata = @{"msg"="开机启动项为:$($result)";}
$data['project']+=$projectdata

#检查关闭默认共享盘 $Key = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa'
$Name = 'restrictanonymous'
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$Name
if($config -eq "1")
{
$data.code = "1"
$projectdata = @{"msg"="关闭默认共享盘策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="关闭默认共享盘策略不符合标准";}
$data['project']+=$projectdata
}


#禁止全部驱动器自动播放
$Key = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer'
$name = "NoDriveTypeAutoRun"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -eq "255")
{
$data.code = "1"
$projectdata = @{"msg"="禁止全部驱动器自动播放符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="禁止全部驱动器自动播放不符合标准";}
$data['project']+=$projectdata
}


#应用日志查看器大小设置
$Key = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application' $name = "MaxSize"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -ge "8192")
{
$data.code = "1"
$projectdata = @{"msg"="应用日志查看器大小设置策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="应用日志查看器大小设置策略不符合标准";}
$data['project']+=$projectdata
}

#系统日志查看器大小设置
$Key = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System' $name = "MaxSize"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -ge "8192")
{
$data.code = "1"
$projectdata = @{"msg"="系统日志查看器大小设置策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="系统日志查看器大小设置策略不符合标准";}
$data['project']+=$projectdata
}

#安全日志查看器大小设置
$Key = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security'
$name = "MaxSize"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -ge "8192")
{
$data.code = "1"
$projectdata = @{"msg"="安全日志查看器大小设置策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="安全日志查看器大小设置策略不符合标准";}
$data['project']+=$projectdata
}

#屏幕自动保护程序
$Key = 'HKEY_CURRENT_USER\Control Panel\Desktop'
$name = "ScreenSaveActive"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -eq "1")
{
$data.code = "1"
$projectdata = @{"msg"="屏幕自动保护程序策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="屏幕自动保护程序策略不符合标准";}
$data['project']+=$projectdata
}


#屏幕保护程序启动时间
$Key = 'HKEY_CURRENT_USER\Control Panel\Desktop'
$name = "ScreenSaveTimeOut"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -le "600")
{
$data.code = "1"
$projectdata = @{"msg"="屏幕保护程序启动时间策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="屏幕保护程序启动时间策略不符合标准";}
$data['project']+=$projectdata
}


#屏幕恢复时使用密码保护
$Key = 'HKEY_CURRENT_USER\Control Panel\Desktop'
$name = "ScreenSaveTimeOut"
$config = (Get-ItemProperty -Path "Registry::$Key" -ErrorAction Stop).$name
if($config -ge "1")
{
$data.code = "1"
$projectdata = @{"msg"="屏幕恢复时使用密码保护策略符合标准";}
$data['project']+=$projectdata
}
else
{
$data.code = "0"
$projectdata = @{"msg"="屏幕恢复时使用密码保护策略不符合标准";}
$data['project']+=$projectdata
}

#结果处理
$date = Get-Date #$result = ""
foreach ($i in $data.project){
#$result += "{'msg':$($i.msg)},"
echo "{'msg':[$($i.msg)]}"
$i.msg >>jixian.txt }

三.执行脚本

Windows操作系统安全加固基线检测脚本的更多相关文章

  1. windows基线检测脚本编写指南-powershell版

    前言:   因为工作的原因,要写windows下的基线检查脚本.之前没接触过,在网上找了半天也没找到现成的,无奈只好自己研究,最后还是成功完成了工作. 在我编写之后发现windows下的基线基本就是检 ...

  2. Windows操作系统安全加固

    本文档旨在指导系统管理人员或安全检查人员进行Windows操作系统的安全合规性检查和配置. 1. 账户管理和认证授权 1.1 账户 默认账户安全 禁用Guest账户. 禁用或删除其他无用账户(建议先禁 ...

  3. 如何利用PowerShell完成的Windows服务器系统安全加固实践和基线检测

    0x00 前言简述 最近单位在做等保测评,由本人从事安全运维方面的工作(PS:曾经做过等保等方面的安全服务),所以自然而然的与信安的测评人员一起对接相关业务系统的检查,在做主机系统测评检查时发现了系统 ...

  4. 完整的WindowsServer服务器系统初始化配置、安全策略加固和基线检查脚本等保2.0适用

    转载自:https://www.bilibili.com/read/cv14326780?spm_id_from=333.999.0.0 0x00 前言简述 最近单位在做等保测评,由于本人从事安全运维 ...

  5. 检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统

    /** * Author: laixiangran. * Created by laixiangran on 2015/12/02. * 检测访问网页的浏览器呈现引擎.平台.Windows操作系统.移 ...

  6. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  7. userAgent,JS这么屌的用户代理,你造吗?——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统

    1.识别浏览器呈现引擎 为了不在全局作用域中添加多余变量,这里使用单例模式(什么是单例模式?)来封装检测脚本.检测脚本的基本代码如下所示: var client = function() { var ...

  8. Kali Linux Web后门工具、Windows操作系统痕迹清除方法

    Kali Linux Web后门工具 Kali的web后门工具一共有四款,今天只介绍WebaCoo 首先介绍第一个WeBaCoo(Web Backdoor Cookie) WeBaCoo是一款隐蔽的脚 ...

  9. 【javascript】浏览器用户代理检测脚本实现

    以下是完整的用户代理字符串检测脚本,包括检测呈现引擎.平台.Windows操作系统.移动设备和游戏系统. var client = function(){ // 呈现引擎 var engine = { ...

随机推荐

  1. 感恩笔记之SQL语句操纵数据集基本功能模板

    SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...

  2. 利用水文分析方法提取山脊线和山谷线(ArcPy实现)

    一.背景 作为地形特征线的山脊线.山谷线对地形.地貌具有一定的控制作用.它们与山顶点.谷底点以及鞍部点等一起构成了地形起伏变化的骨架结构.同时由于山脊线具有分水性,山谷线具有合水性特征,使得它们在地形 ...

  3. 技术番外篇丨Github Action CI/CD

    起源 看到.Net群里再聊CI/CD,我就这里分享一下我目前自己一些小东西的做法,我目前在Github有一个自己私有的组织,里面存放了我的部分商业化项目,早期我采用Jenkins用Webhooks进行 ...

  4. 洛谷2120 [ZJOI2007]仓库建设(斜率优化dp)

    感觉和锯木厂那个题很类似的. 其实这个题还那个题唯一的区别就是\(dp\)转移式子中的\(f\)变成了\(g\) qwq不想多说了 直接看我的前一篇题解吧qwq #include<iostrea ...

  5. iOS自动化之WDA(WebDriverAgent)安装

    1.WDA介绍 WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备.你可以启动.杀死应用,点击.滚动视图 ...

  6. 一次简单的SQL注入绕WAF

    本人也是小白一枚,大佬请绕过,这个其实是六月份的时候做的,那时候想多点实战经验,就直接用谷歌搜索找了一些网站,这个是其中一个 1.目标网站 2.发现有WAF防护 3.判断存在注入 4.猜测了一下闭合为 ...

  7. git 更新与图形界面

    git 软件更新:git update-git-for-windows 或者 git update gitk 是一个历史记录的图形化查看器. 使用:只需 cd 到一个 Git 仓库,然后键入:gitk ...

  8. Linux 命令后&的作用

    cp $filename /dev/ & & 代表非阻塞方式拷贝文件,如果不加& 则必须等到执行完该指令后才能执行后来的指令.

  9. BPMN 學習實例

    什麼是業務流程圖? What is BPMN 業務流程建模符號(BPMN)是業務流程建模的一種方法.它基於統一建模語言(UML)中活動圖的概念,以圖形符號(業務流程圖)支持業務流程的規範.BPMN為企 ...

  10. MySQL:怒刷牛客网“sql实战”

    MySQL:怒刷牛客网"sql实战" 在对MySQL有一定了解后,抽空刷了一下 牛客网上的 数据库SQL 实战,在此做一点小小的记录 SQL1 查找最晚入职员工的所有信息 sele ...