вторник, 20 октября 2015 г.

show disabled users and not hiden from address book (include witout mailbox)
get-mailbox -ResultSize Unlimited * | where {(-not $_.HiddenFromAddressListsEnabled) -and (-not (get-aduser $_.samaccountname).enabled)} | sort-object name | select name, alias

четверг, 6 августа 2015 г.

сразу несколько штук для памяти:
работа в скрипте с длинными именами+пробелы (linux bash)

#!/bin/bash
find /tmp -name "*.gz" -type f -print0 | while read -d $'\0' i
do
  gzip -d "$i"
done

=========

приравнять пользователя по правам и затем отобрать их назад(windows powershell)
# {}.memberof <===> Select-Object -ExpandProperty memberof ------ выбор объекта
#сохраняем текущие группы в файл
(Get-ADUser -Identity SaraDavis -property memberof).memberof | export-clixml SaraDavis-memberof.xml
#назначаем
(Get-ADUser -Identity User123 -property memberof).memberof | Add-ADGroupMember [-members] SaraDavis[,User2,User3]

#а теперь отбираем
$old1=import-clixml SaraDavis-memberof.xml
foreach($i in (Get-ADPrincipalGroupMembership -Identity SaraDavis -property memberof).memberof){
  if(-not($old1 -contains $i)){"$i" | Remove-ADGroupMember SaraDavis}}


profit

четверг, 11 июня 2015 г.

Чистим неиспользуемые почтовые каталоги postfix
postfix работает с mysql.
в каталоге /var/mail которую он обслуживает находятся каталоги доменов:
/var/mail
   domain1.ru
   domain2.com
   domain3.org

в этих каталогах хранятся много пользовательских каталогов, хозяева которых уже уволились или не пользуются посфиксом. Задача их вычистить. Т.е. сопоставить таблицу aliases поле address из базы postfix и структуры каталогов для домена. Вывести тех кто отсутствует в этом поле, но чей каталог присутствует в /var/mail/domainX.XXX

#!/usr/bin/env python
# -*- coding: utf8 -*-

import mysql.connector
from mysql.connector import Error
import sys,os
import subprocess

mysqlserver="192.168.0.1"
mysqldb="postfix"
mysqluserlogin="user"
mysqluserpasword="password"


"""
# задел на работу по ssh - пока не используем
def ssh_command(HOST,KEYS,COMMAND):
   print("ssh %s %s %s" % (KEYS,HOST,COMMAND))
   ssh = subprocess.Popen(["ssh %s" % KEYS, "%s" % HOST, COMMAND],
                       shell=False,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
   result = ssh.stdout.readlines()
   if result == []:
       error = ssh.stderr.readlines()
       print >>sys.stderr, "ERROR: %s" % error
   else:
       return result
   return
"""

rowmails=[]
rowdomains=[]

try:
   conn = mysql.connector.connect(host=mysqlserver,
                                   database=mysqldb,
                                   user=mysqluserlogin,
                                   password=mysqluserpasword)
   if conn.is_connected():
            print('Connected to MySQL database')
   cursor = conn.cursor()

   cursor.execute("SELECT address FROM alias where domain = 'domain1.ru'")
   row=cursor.fetchone()

   while row is not None:
      rowmails.append(row[0])
      row=cursor.fetchone()

except Error as e:
        print(e)
finally:
    conn.close()

if len(rowmails)<=0:
   print("sql query returns zero rows")
   sys.exit(1)

MAILDIR="/var/mail/domain1.ru/"
for f in os.listdir(MAILDIR):
   if os.path.isdir(MAILDIR+f):
       if f not in rowmails:
           print(MAILDIR+f)
sys.exit(0)

четверг, 14 мая 2015 г.

How to prevent python decompile procedure?
Unfortunatly, python is a interpretation programming language
How we can defence our authority rights?
One way: use gcc and write python module for some critical data, for example some often used function or constats.

Как защитить python-код от декомпиляции?
Хреновость состоит в том что python является интерпритационным языком, а как известно любые программы компиляции в байт-код несостоятельны против декомпиляторов. 
(такие процедуры как py_compile.compile или даже py_installer - это все не годится)
Проще говоря если хочешь защитить код то стандартным способом из python это хрен сделаешь. Как быть? Ответ один: использовать пакет для python development и писать python-модуль который будет содержать некие критические данные, будь-то функции или константы.

apt-get install python-dev

Напишем-ка для примера модуль одна функция которого будет возвращать login для сайта superjob

#include <Python.h>

char *
_SJ1LOGIN(void)
{
    return "sj1loginname";
}

static PyObject*
SJ1LOGIN(PyObject* self, PyObject* args)
{
    return Py_BuildValue("s", _SJ1LOGIN());
}

static PyMethodDef SecureMethods[] = {
    {"sj1login", SJ1LOGIN, METH_NOARGS, "superjob login name"},
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC
initsecuredata(void)
{
    (void) Py_InitModule("securedata", SecureMethods);
}

Так же создадим в том же каталоге py-файлик для компиляции этого всего дела и назовем его setup.py

from distutils.core import setup, Extension

module1 = Extension('securedata', sources = ['securedata.c'])

setup (name = 'securedata',
        version = '1.0',
        description = '',
        ext_modules = [module1])

делаем 
python setup.py build

в каталоге build ищем securedata.so
далее это дело можно подцепить из ipython:

import securedata
print(securedata.sj1login())

что и требовалось доказать
литература:


вторник, 5 мая 2015 г.

Фото для echange в AD:

Пункт первый: Схема AD. Требуется небольшое редактирование схемы — щелчок аттрибуту thumbnailPhoto, для его репликации в Global Catalog.

Если вы еще не регистрировали оснастку MMC “AD Schema” — самое время:
Regsvr32 schmmgmt.dll
Открывайте оснастку “AD Schema”
Разверните раздел “Attributes” и найдите thumbnailPhoto. (В оснастке AD Schema аттрибуты сортируются по ldapDisplayName).
На странице свойств аттрибута выберите “Replicate this attribute to the Global Catalog” , и OK.

Теперь можно приступать к загрузке фотографий с помощью командлета Import-RecipientDataProperty, как показано ниже:

Import-RecipientDataProperty -Identity "Vasya Pupkin" -Picture -FileData ([Byte[]]$(Get-Content -Path "C:picturesVasyaPupkin.jpg" -Encoding Byte -ReadCount 0))

Можно задействовать поточную операцию, применяя Get-Mailbox с фильтрами (или Get-DistributionGroupMember если вам нужны члены групп), а результаты потом отправить в циклforeach. Имена пользователей и пути до изображений можно брать из CSV/TXT списка.



Убрать фотку:

Q. How can I remove a user's photo from Active Directory?
A. The Import-RecipientDataProperty and Export-RecipientDataProperty cmdlets allow you to import and export the photo blob to and from thumbnailPhoto attribute, but there's no Remove-RecipientDataProperty cmdlet to remove it. You can use the RemovePicture switch of Set-Mailboxcmdlet to remove a user's photo. For example:

Set-Mailbox "Bharat Suneja" -RemovePicture

You can also use Active Directory tools such as ADSIEdit to null the thumbnailPhoto attribute.

If you want to disable GAL Photos in Outlook 2010 but want to retain 
the thumbnail for other applications, you can do so using a client-side 
registry value or group policy setting, as answered above.



=====================

литература:

http://maximumexchange.ru/2010/03/15/gal-photos-in-exchange-2010-and-outlook-2010/

https://social.technet.microsoft.com/Forums/ru-RU/efcfec6e-0244-4a6f-b6a8-9859a981aa9f/-outlook?forum=exchange2010ru


четверг, 19 марта 2015 г.

Сохраняем телефонные разговоры asterisk

[default-ololo]
exten => _X.,1,Set(dirname="/var/www/asterisk/mp3/${STRFTIME(${EPOCH},,%d_%m_%Y)}")
SIPCALLID=${SIPCALLID}" >> /tmp/1111.txt)
exten => _X.,n,Set(fname="${STRFTIME(${EPOCH},,%d_%m_%Y_%H:%M)}-${CALLERID(num)}-${EXTEN}")
exten => _X.,n,Set(monopt= nice -n 14 /usr/bin/lame -b 16 --silent "/tmp/wav/${fname}.wav" "${dirname}/${fname}.mp3" && chmod o+r,g+r "${dirname}/${fname}.mp
exten => _X.,n,MixMonitor(/tmp/wav/${fname}.wav,b,${monopt})
exten => _X.,n,Dial(SIP/avaya/${EXTEN})
exten => _X.,n,Hangup()



четверг, 26 февраля 2015 г.

Забираем по фтп файлы *.bak
python3

import ftplib,sys

def getbinary(ftp, filename, outfile):
   try:
      print("retrieving file "+filename+' to -> '+outfile+"...")
      fout=open(outfile,'wb')
      ftp.retrbinary("RETR " + filename, fout.write)
      fout.close()
   except:
      print("somthing wrong! error")
      sys.exit(2)

def getpastfilenamofdir(ftp, dir):
    ftp.cwd(dir)
    pastfilename=ftp.nlst('*.bak')[-1:][0]
    getbinary(ftp, pastfilename, pastfilename)

ftp=ftplib.FTP('10.10.10.10')
ftp.login('user','password')

getpastfilenamofdir(ftp, 'folder1')
getpastfilenamofdir(ftp, '../folder2/folder3')
getpastfilenamofdir(ftp, '../../folder4')
ftp.close()

sys.exit(0)

воскресенье, 1 февраля 2015 г.

Пишем штуку для отправки файла в некую компанию. С авторизацией и конфигом ;)
Все оригинальные имена email,файлов/URLов похерены.
Используется изнутри 1С для отправки сформированного csv файла.

# -*- coding: utf8 -*-
# alex~~~@zztop.ru, 2015

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys,codecs
from os.path import isfile
import ConfigParser

#http://habrahabr.ru/post/117236/
def setup_console(sys_enc="utf-8"):
    reload(sys)
    try:
        if sys.platform.startswith("win"):
            import ctypes
            enc = "cp%d" % ctypes.windll.kernel32.GetOEMCP()
        else:
            enc = (sys.stdout.encoding if sys.stdout.isatty() else
                        sys.stderr.encoding if sys.stderr.isatty() else
                            sys.getfilesystemencoding() or sys_enc)

        sys.setdefaultencoding(sys_enc)

        if sys.stdout.isatty() and sys.stdout.encoding != enc:
            sys.stdout = codecs.getwriter(enc)(sys.stdout, 'replace')

        if sys.stderr.isatty() and sys.stderr.encoding != enc:
            sys.stderr = codecs.getwriter(enc)(sys.stderr, 'replace')

    except:
        pass

def recreateconf():
   try:
      f1=open('ololo.conf','w')
      f1.write("[MAIN]\nURL=http://parts.bmw.ru\nLOGIN=qwerty@mail.ru\nPASSWD=password123\nFILENAME=c:/temp/ololo.csv\nTESTMODE=on")
      f1.close()
   except:
      print u"Невозможно записать файл ololo.conf - ошибка"
      sys.exit(3)

setup_console()

if not isfile('phantomjs.exe'):
   print u"Ошибка:\n"+\
         "\tФайл PhantomJS.exe является необходимым драйвером браузера для работы программы"+"\n"+\
         "\tНайти последнюю его версию можно здесь: http://phantomjs.org/download.html"
   sys.exit(1)

if not isfile('renaultsend.conf'):
   print u"Ошибка:\n"+\
         "\tФайл ololo.conf является необходимым файлом конфигурации"+"\n"+\
         "\tПримерный файл конфигурации создан, ознакомьтесь если требуется"
   recreateconf()
   sys.exit(2)

url=''
login=''
passwd=''
filename=''
testmode='off'

try:
   cparser=ConfigParser.ConfigParser()
   cparser.read('renaultsend.conf')
   url=cparser.get('MAIN','URL')
   login=cparser.get('MAIN','LOGIN')
   passwd=cparser.get('MAIN','PASSWD')
   filename=cparser.get('MAIN','FILENAME')
   if cparser.has_option('MAIN','TESTMODE'):
      testmode=cparser.get('MAIN','TESTMODE')
except:
   print u"Ошибка:\n"+\
         "\tНевозможно прочитать файл либо неверный формат файла конфигурации ololo.conf\n"\
         "\tУдалите ololo.conf и перезапустите программу. Файл будет пересоздан"
   sys.exit(4)

try:
   driver=webdriver.PhantomJS()
   retcode=0
   driver.implicitly_wait(60)
   driver.get(url)
#вводим логи/пароль+ввод в поле пароля
   print u"Попытка отправки файла "+filename+"\n"
   driver.find_element_by_xpath('//*[@id="minWidth"]/div[2]/div/div[1]/div/form/input[1]').send_keys(login)
   driver.find_element_by_xpath('//*[@id="minWidth"]/div[2]/div/div[1]/div/form/input[2]').send_keys(passwd+Keys.ENTER)
   driver.find_element_by_xpath('//*[@id="minWidth"]/div[2]/div[2]/div[1]/div[3]/a').click()
   driver.find_element_by_xpath('//*[@id="minWidth"]/div[2]/div[2]/div[1]/a[2]').click()
   driver.find_element_by_xpath("//input[@type='file']").send_keys(filename)
   if testmode=="on": 
      try:
        driver.save_screenshot("result.jpg")
        print u"Включен testmode\n"+\
           "Скриншот с результатом последней страницы result.jpg сброшен успешно"
      except:
        print u"Внимание: не удалось сохранить скриншот result.jpg"
   else: 
      driver.find_element_by_xpath('//*[@id="minWidth"]/div[2]/div[2]/div[1]/form/input[2]').click()
except:
   print u"Непонятная ошибка с сайтом - возможно изменился контент или неверный логин/пароль.\n"+\
          "Если вы уверены что логин/пароль норм, попробуйте обратиться к разработчику alex~~~@zztop.ru ;)"
   retcode=5
finally:
   recreateconf()
   try:
       driver.quit()
   except:
       print u"Невозможно уничтожить созданный web driver, при работе произошла ошибка\n"

if retcode==0:
   print u"Все прошло успешно!"
sys.exit(retcode)

вторник, 27 января 2015 г.

Архивируем и отправляем в компанию "Что делать консалт" каталог STS.
Система исполнения - виндоза!

# -*- coding: utf-8 -*-
from smartgate import sendmail
from sys import exit
import os,zipfile, zlib

PATH2CONS="d:\\Consult"
PATH2ZIP=os.environ.get('tmp')+'\\sts.zip'

if not os.path.exists(PATH2CONS):
   print "Consultant not found at path:"+PATH2CONS
   exit(1)

zf=zipfile.ZipFile(PATH2ZIP,"w",zipfile.ZIP_DEFLATED)
for root,dirs,files in os.walk(PATH2CONS+'\\ADM\\STS'):
   for file in files:
      zf.write(os.path.join(root,file))

zf.close()
if 0==sendmail('192.168.0.1','mymail(собака)mycompany.ru',['blah-blah(собака)konsultant.ru'],"STS VERONIKA","have a fun :)",[PATH2ZIP]):
   os.remove(PATH2ZIP)

понедельник, 12 января 2015 г.

Задача: создаем список случайного размера из случайных элементов состоящих минимум из пяти символов, при чем каждый элемент содержит произвольные буквы (и заглавные и строчные) и цифры. Вывести массив на экран. Исполнение python3

import random
import string

def id_generator(size=6, chars=string.ascii_letters + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

randarray1=[id_generator(random.randint(5,11)) for i in range(random.randint(70,97))]
print ("%s" % list(randarray1[i] for i in range(1,len(randarray1))))



зачем это:
если встретилось уже третий раз, то надо записать - copy/paste проще и быстрее. я ленивый..