четверг, 21 декабря 2017 г.

powershell. Get host uptime remote:

$OS = Get-WmiObject win32_operatingsystem -ComputerName COMPNAME
$BootTime = $OS.ConvertToDateTime($OS.LastBootUpTime)
$Uptime = $OS.ConvertToDateTime($OS.LocalDateTime) - $boottime

by https://gallery.technet.microsoft.com/scriptcenter/Get-Uptime-PowerShell-eb98896f

$wmi = Get-WmiObject -Class Win32_OperatingSystem -ComputerName COMPNAME
$wmi.ConvertToDateTime($wmi.LocalDateTime) – $wmi.ConvertToDateTime($wmi.LastBootUpTime)

среда, 13 декабря 2017 г.

Показать все сервисы, запущенные не от локальных системных учёток.

Get-WmiObject win32_service | ?{-not (($_.StartName -match "LocalService") -or ($_.StartName            -match "LocalSystem") -or ($_.StartName -match "NetworkService"))} | select name,Startname

четверг, 30 ноября 2017 г.

Show all computer with old lastlogondate

get-adcomputer -filter {Enabled -eq $True} -searchbase "ou=Computers,dc=domain,dc=net" -properties lastlogondate, lastlogon | where{(get-date $_.LastLogonDate) -lt (get-date 2017-11-01)} |    sort-object lastlogondate | select name, lastlogondate

вторник, 28 ноября 2017 г.

ManageEngine ServiceDesk moving from linux to windows attachments problem: can't find attachment.

use servicedesk;
SET SQL_SAFE_UPDATES = 0;
update sdeskattachment set ATTACHMENTPATH = replace(ATTACHMENTPATH, "/", "\\") WHERE 1=1;

пятница, 29 сентября 2017 г.

powershell script for set some ad attributes
in data - csv file

#by alex
import-module activedirectory
clear
$path = 'c:\scripts\users-info-update.csv'

$csv = Import-Csv $path

foreach($usercsv in $csv){
 $usercsv.DisplayName
 if($usercsv.mobile){
  Set-ADUser $usercsv.sAMAccountName -mobile $usercsv.mobile
  "set mobile "+$usercsv.mobile
  }

 if($usercsv.description){
  Set-ADUser $usercsv.sAMAccountName -Description $usercsv.description
  "set description "+ $usercsv.description
  }

if($usercsv.title){
  Set-ADUser $usercsv.sAMAccountName -Title $usercsv.title
  "set title "+$usercsv.title
  }

 Set-ADUser $usercsv.sAMAccountName -Company "Company"
 if($usercsv.ipPhone){
  try{
   Set-ADUser $usercsv.sAMAccountName -Add @{'ipPhone'=[string]$usercsv.ipPhone}
   "add ipPhone "+$usercsv.ipPhone
   }
  catch{
    Set-ADUser $usercsv.sAMAccountName -Replace @{'ipPhone'=[string]$usercsv.ipPhone}
    "replace ipPhone "+$usercsv.ipPhone
    }
 }

 if($usercsv.telephoneNumber){
    Set-ADUser $usercsv.sAMAccountName -OfficePhone $usercsv.telephoneNumber
   "replace telephoneNumber "+$usercsv.telephoneNumber
  try{
   Set-ADUser $usercsv.sAMAccountName -Add @{'HomePhone'=[string]$usercsv.telephoneNumber}
   }
  catch{
    Set-ADUser $usercsv.sAMAccountName -Replace @{'HomePhone'=[string]$usercsv.telephoneNumber}
    }

 }

if($usercsv.facsimileTelephoneNumber){
  try{
   Set-ADUser $usercsv.sAMAccountName -Add @{'facsimileTelephoneNumber'=[string]$usercsv.facsimileTelephoneNumber}
   "add facsimileTelephoneNumber "+$usercsv.facsimileTelephoneNumber
   }
  catch{
    Set-ADUser $usercsv.sAMAccountName -Replace @{'facsimileTelephoneNumber'=[string]$usercsv.facsimileTelephoneNumber}
   "replace facsimileTelephoneNumber"+$usercsv.facsimileTelephoneNumber
    }
 }
}

среда, 14 июня 2017 г.

Trigger for ManageEngine Servicedesk Plus. example
Триггер для ManageEngine Servicedesk Plus. пример

SD trigger string:
powershell -file c:\scripts\cancelrequest.ps1 отклонена $WORKORDERID

code:

#powershell script for manageengine SDP trigger
#by *me
Param ([string] $txt, [string]$WORKORDERID)
$TECHNICIAN_KEY='XXXXXX-XXXXXXX-XXXXXX-XXXXXX'
$SDEMAIL="sd@domain.com"
$SUBJECT = "Ваша заявка ##{0}## была {1}" -f $WORKORDERID, $txt  
$LOGFILE="c:\scripts\cancelrequest.log"
$MAILSERVER="mail.domain.com"
$SDHOST="https://localhost"

#errorcodes
$REQUESTERNOTFOUNDERROR=-101


function sendrequest($uri)
{
 $response = Invoke-RestMethod -Uri $uri
 if($response.operation.result.status -ne "Success"){
   $message = "function {0} returns non success result:`n{1}" -f $MyInvocation.MyCommand.Name, $response.operation.result  
   throw $message}
 return $response
}

function getrequest([string]$id)
{
 $uri=$SDHOST+'/sdpapi/request/'+$id+'?OPERATION_NAME=GET_REQUEST&TECHNICIAN_KEY='+$TECHNICIAN_KEY+'&format=json'
 Invoke-RestMethod -Uri $uri -Method Get
 return $response
}


function getresolution([string]$id)
{
 $uri=$SDHOST+'/sdpapi/request/'+$id+'?OPERATION_NAME=GET_RESOLUTION&TECHNICIAN_KEY='+$TECHNICIAN_KEY+'&format=json'
 $response = sendrequest($uri) 
 return $response.operation.Details.RESOLUTION
}

function getrequester($r)
{
 $uri=$SDHOST+'/sdpapi/requester?OPERATION_NAME=GET_ALL&TECHNICIAN_KEY='+$TECHNICIAN_KEY+'&INPUT_DATA={"operation":{"details":{"name":"'+$r+'"}}}&format=json'
 #log("uri="+$uri)
 $response = sendrequest($uri)
 return $response.operation.details
}

function log([string]$txt)
{
 add-content $LOGFILE $txt 
}

function main(){
  log(Get-Date -format "dd.MM.yyyy H:m")
  log("WORKORDERID="+$WORKORDERID)
  $request = getrequest($WORKORDERID)
  $REQUESTER = $request.REQUESTER
  log("REQUESTER="+$REQUESTER) 

  $requesterdata=getrequester($REQUESTER)
  if(![boolean]$requester){
   log("Requester not found. Abnormal oO")
   return $REQUESTERNOTFOUNDERROR}

  $to = @($requesterdata.emailid)[0] 
  $from = $SDEMAIL 
  $body = getresolution($WORKORDERID) 
  log("Sending mail to:"+$to)
  log("="*40)
  $encoding = [System.Text.Encoding]::UTF8
  send-MailMessage -SmtpServer $MAILSERVER -To $to -From $from -Subject $SUBJECT -Body $body -BodyAsHtml -Encoding $encoding
}

add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    
    public class IDontCarePolicy : ICertificatePolicy {
        public IDontCarePolicy() {}
        public bool CheckValidationResult(
            ServicePoint sPoint, X509Certificate cert,
            WebRequest wRequest, int certProb) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = new-object IDontCarePolicy 

try{
 main}
catch{
   $ErrorMessage = $_.Exception.Message
   log("Exception detected!`n"+"Error message:"+$ErrorMessage+"`n"+'='*40)
   return -1}

среда, 3 мая 2017 г.

create ssl cert for chrome 58 (subjectAltName add)
openssl req \
    -newkey rsa:2048 \
    -x509 \
    -nodes \
    -keyout server.key \
    -new \
    -out server.crt \
    -subj /CN=dev.mycompany.com \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat /System/Library/OpenSSL/openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')) \
    -sha256 \
    -days 3650

четверг, 27 апреля 2017 г.

Устанавливаем роль RDS+CB+WA пошем

Import-module ServerManager -verbose
Get-WindowsFeature -Name *RDS*
Add-WindowsFeature -Name RDS-RD-Server,RDS-Web-Access,RDS-Connection-Broker -IncludeAllSubFeature -WhatIf
New-SessionDeployment -ConnectionBroker "servername.domain" -WebAccessServer "servername.domain" -SessionHost "servername.domain"

четверг, 30 марта 2017 г.

Убиваем неактивные терминальные сессии скриптом.

foreach ($i in qwinsta /server:terminal | select-string "Диск" | where{$_.tostring()}|where{$_  -notlike "*service*"}){$b=$i.tostring().split()|where{$_}|where{$_ -match "^\d+$"};reset session $b /server:terminal}

суббота, 11 февраля 2017 г.

Магия python.
Реальная задача из жизни. ManageEngine Servicedesk хранит аттачменты для coversations (ответов заявителей) в каталоге MESD homedir\fileAttachments\Conversations\
Но дальше внутри этого каталога он хранит их пачками по 5000 ConversationID.
Типа: 1_5000, 5001_10000, 10001_15000 и тд. Соотвественно ConversationID с номером 24990 попадет в каталог 20000_25000. Задача: напистать функцию определения имени директории наиболее коротким способом.

#ci - input ConversationID
#maxci - maximum of ConversationID (for example 1 million)
#returns dir name of ConversationID
def funcname(ci, maxci):
   a = [i for i in range(0,maxci,5000)]
   b = []
   b+=[str(a[i]+1)+'_'+str(a[i+1]) for i in range(0,len(a)-1)]
   return b[a.index(a[ci//5000 - 1 if ci%5000==0 else ci//5000])]

Результат: