Главная > PowerShell > Перемещение рабочих станций в контейнер если они не подключались к AD более 60 дней

Перемещение рабочих станций в контейнер если они не подключались к AD более 60 дней

Потребовалось как то написать скрипт который следил бы за РС в AD. Точнее избавлял бы от мусора.
На просторах интернета куча подобных но этот я делал сам и выкладываю для себя ), чтобы потом не искать.
Скрипт перемещает а затем удаляет старые РС, и записывает свои операции в sql базу.

# ==============================================================================================
#
# Microsoft PowerShell Source File -- Created with SAPIEN Technologies PrimalScript 2011
#
# DATE  : 04.06.2013
#
# COMMENT: Перемещает рабочие станции в контейнер если они не подключались к AD более 60 дней.
#
# ==============================================================================================
 
# Включаем поддержку Active Directory в PowerShell
Import-Module ActiveDirectory
 
# Задаём временные промежутки.
$today = Get-Date -Format "dd-MM-yyyy"
$60days = Get-Date (Get-Date).adddays(-60)
$90days = Get-Date (Get-Date).adddays(-90)
$move = "Move"
$delete = "Delete"
 
# Задаём переменные подключения.
$SQLServer = "S502-W-SQLCL03\SQL02"
$SQLDBName = "AuditADPC"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; Integrated Security = True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
 
# Отслеживаем мёртвые компьютеры.
#Компьютера нет 60 дней! Пора перемещать и выключать!
Get-ADComputer -filter {(enabled -eq "true") -and (lastlogontimestamp -le $60days)} -properties cn,lastlogontimestamp | where {$_.lastlogontimestamp -ne $null} | Move-ADObject -TargetPath 'OU=NotSetComputers,DC=tpce,DC=tomsk,DC=ru'
$computers60 = Get-ADComputer -filter {(enabled -eq "true")} -SearchBase "OU=NotSetComputers,DC=tpce,DC=tomsk,DC=ru" -properties description,operatingSystem,dNSHostName,cn,distinguishedName,lastlogontimestamp,description,SAMAccountName
$SqlConnection.Open()
$SqlCmd.connection = $SqlConnection
 
Function WriteToSQLMove
{ 
    Param( 
        [string] $_cn, 
        [string] $_distinguishedName,
		[string] $_dNSHostName,
		[string] $_lastLogonTimestamp,
		[string] $_operatingSystem,
		[string] $_description,
		[string] $_SAMAccountName
        )
	Get-ADComputer -filter {(enabled -eq "true")} -SearchBase $_distinguishedName | Set-ADComputer -Enabled $false
    $time = [datetime]::FromFileTime($_lastLogonTimestamp) 
	$SqlCmd.CommandText = "INSERT INTO PC VALUES('$_cn','$_distinguishedName','$_dNSHostName','$time','$_operatingSystem','$_description','$_SAMAccountName',GetDate(),'$move')"
	$SqlCmd.ExecuteNonQuery()
} 
 
FOREACH ($User in $computers60) { 
    if ($User -eq $null) {break}
    WriteToSQLMove $User.cn $User.distinguishedName $User.dNSHostName $User.lastLogonTimestamp $User.operatingSystem $User.description $User.SAMAccountName
}
$SqlConnection.Close()
 
# Удаляем мёртвые компьютеры.
#Компьютера нет 90 дней! Пора Удалять!
$computers90 = Get-ADComputer -filter {(enabled -eq "false") -and (lastlogontimestamp -le $90days)} -SearchBase "OU=NotSetComputers,DC=tpce,DC=tomsk,DC=ru" -properties description,operatingSystem,dNSHostName,cn,distinguishedName,lastlogontimestamp,description,SAMAccountName | where {$_.lastlogontimestamp -ne $null}
$SqlConnection.Open()
 
Function WriteToSQLDelete
{ 
    Param( 
        [string] $_cn, 
        [string] $_distinguishedName,
		[string] $_dNSHostName,
		[string] $_lastLogonTimestamp,
		[string] $_operatingSystem,
		[string] $_description,
		[string] $_SAMAccountName
        )
	Get-ADComputer -filter {(enabled -eq "false") -and (lastlogontimestamp -le $90days)} -SearchBase $_distinguishedName | Remove-AdObject -Recursive -Confirm:$false
    #Remove-ADComputer -Identity $_cn -confirm:$false
    $time = [datetime]::FromFileTime($_lastLogonTimestamp) 
	$SqlCmd.CommandText = "INSERT INTO PC VALUES('$_cn','$_distinguishedName','$_dNSHostName','$time','$_operatingSystem','$_description','$_SAMAccountName',GetDate(),'$delete')"
	$SqlCmd.ExecuteNonQuery()	
} 
 
FOREACH ($User in $computers90) { 
    if ($User -eq $null) {break}
    WriteToSQLDelete $User.cn $User.distinguishedName $User.dNSHostName $User.lastLogonTimestamp $User.operatingSystem $User.description $User.SAMAccountName
}
 
$SqlConnection.Close()

Так же приложу скрипт создания базы sql. База MS SQL 2008R2.

USE [master]
GO
/****** Object:  Database [AuditADPC]    Script Date: 06/13/2013 09:42:11 ******/
CREATE DATABASE [AuditADPC] ON  PRIMARY 
( NAME = 'AuditADPC', FILENAME = 'N:\MSSQL10_50.SQL02\MSSQL\DATA\AuditADPC.mdf' , SIZE = 3072KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON 
( NAME = 'AuditADPC_log', FILENAME = 'N:\MSSQL10_50.SQL02\MSSQL\DATA\AuditADPC_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [AuditADPC] SET COMPATIBILITY_LEVEL = 100
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [AuditADPC].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [AuditADPC] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [AuditADPC] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [AuditADPC] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [AuditADPC] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [AuditADPC] SET ARITHABORT OFF 
GO
ALTER DATABASE [AuditADPC] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [AuditADPC] SET AUTO_CREATE_STATISTICS ON 
GO
ALTER DATABASE [AuditADPC] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [AuditADPC] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [AuditADPC] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [AuditADPC] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [AuditADPC] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [AuditADPC] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [AuditADPC] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [AuditADPC] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [AuditADPC] SET  DISABLE_BROKER 
GO
ALTER DATABASE [AuditADPC] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [AuditADPC] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [AuditADPC] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [AuditADPC] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [AuditADPC] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [AuditADPC] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [AuditADPC] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [AuditADPC] SET  READ_WRITE 
GO
ALTER DATABASE [AuditADPC] SET RECOVERY SIMPLE 
GO
ALTER DATABASE [AuditADPC] SET  MULTI_USER 
GO
ALTER DATABASE [AuditADPC] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [AuditADPC] SET DB_CHAINING OFF 
GO
Categories: PowerShell Tags:
  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.