Search
Write a publication
Pull to refresh
7
0
Dmitriy Novikov @HomeDimoN

User

Send message
а в «реализация иерархического запроса» в lvl не забыт ли +1 после union all?
эээ
система сборки MSSQL базы и приложения на C# .NET?
и без системы контроля версии? (номер версии тоже должен быть в базе)
и без обратного преобразования из базы в проект?

Пример бы поменьше… из 2-3 табличек + вьюх + процедур
Exchange 2010 снят с поддержки и для него не будет исправление уязвимости…
Передайте управления PKI доверенному УЦ
Сократите затраты на владение до 50%

После этих заявлений хотелось бы увидеть цены…
Давно использую powershell для задач выгрузки схемы SQL
За основу взят скрипт Export MSSQL schema with PowerShell. This script will export your schema definitions for tables, stored procs, triggers, functions and views to .sql files (вроде похож).
Но допилен для выгрузки ролей, прав и расширенных свойств (sp_addextendedproperty) баз, таблиц, полей.
Конфиг храню в XML.
Осталось раскрыть тему Docker + forge + windows 10 WSL
Ну или хотя бы Docker + forge

Компы вывезли?
Исходники nGinx Plus там были?
Скоро ждать появления nGinx Plus в Едином реестре российских программ?
А Сбер/Rambler выложит исходники nGinx Plus на GitHub?
А как скоро Сбер/Rambler допилит (ну что бы прям из «коробки») в nGinx Plus поддержку российских крипто алгоритмов?
Как вставить свою иконку в форму
Ресурс храниться внутри скрипта.
#каринка в base64
base64IconString = "iVB...mCC"
$bitmap = New-Object System.Windows.Media.Imaging.BitmapImage
$bitmap.BeginInit()
$bitmap.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($base64IconString)
$bitmap.EndInit()
$bitmap.Freeze()

$form.Icon = $bitmap

почти таким же способом можно подгрузить и другие ресурсы

Смена цвета элемента в заместо подгрузки картинки
Фрагмент вырезан из другого скрипта и не адаптирован под текущий…
В данном примере элемент $Ping кнопка и она меняет цвет и текст в зависимости от результата…
        if (Test-Connection $ComboBox.Text -Count 1 -Quiet) {
            $Ping.content = "Ping ok"
            $Ping.Background = "#FF3BE62A"
        }
        else {
            $Ping.content = "Ping ERROR!"
            $Ping.Background = "#FFE62A2A"
        }

можно сделать что бы пинговать только отдельный ресурс…

Хранение настроек в XML
Пример хранения настроек в XML. Взято из другого скрипта
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <Windows>
    <WindowsTitle>Выберите компьютер</WindowsTitle>
    <WindowsToolTip>Программа передает имя компьютера как параметр на запуск</WindowsToolTip>
    <Lable>Выберите компьютер из списк или внесите свой:</Lable>
    <ToolTip>Выберите компьютер из списк или внесите свой, для запуска остнастки</ToolTip>
    <Button>Запустить остнаску</Button>
  </Windows>
  <Programm>
    <RunnungString>c:\windows\system32\compmgmt.msc</RunnungString>
    <ParametrString>/s /computer:$parametr</ParametrString>
  </Programm>
  <list>
    <name>Server.Domain.name</name>
    <name>OtherServer.Domain.name</name>
  </list>
</Settings>

$myDir = [System.AppDomain]::CurrentDomain.BaseDirectory.TrimEnd('\')
if ($myDir -eq $PSHOME.TrimEnd('\')) { $myDir = $PSScriptRoot}
If (!(Test-Path $MyDir\Settings.xml)) {write-host 'Setting file ' $MyDir\Settings.xml ' not found..' -ForegroundColor Red ; exit}
[xml]$ConfigFile = Get-Content $ConfigXML


$form.Title = $ConfigFile.Settings.Windows.WindowsTitle
$form.ToolTip = $ConfigFile.Settings.Windows.WindowsToolTip

$ComboBox.ToolTip = $ConfigFile.Settings.windows.ToolTip
$button1.Content = $ConfigFile.Settings.windows.Button

$RunnungProgrammString = $ConfigFile.Settings.Programm.RunnungString
$RunnungParametrString = $ConfigFile.Settings.Programm.ParametrString

#Добвление в цикле множества элементов
[array]$ComboBoxItems = $ConfigFile.Settings.list.name
$ComboBoxItems| % {
    $ComboBox.Items.Add($_)| out-null
}

Сохранение настроек в XML. Добавление новых записей в секцию Settings\list
$ConfigFile.Settings.list.AppendChild($newSettings)
$ConfigFile.Save($ConfigXML)



Формы проще рисовать через XAML (есть графические редкаторы).
Для уведомления можно сделать не только звук но и Baloon Popup в трее.
Таки не понял, причем тут «народовластие, киберпанк, democracy, cyberpunk»
Таки не понял, в чем преимущество?
Таки не понял, а что проект tiddlywiki уже умер?

tiddlywiki:
  • CSS, JavaScript, ресурсы, картинки в одном «флаконе» HTML файле
  • Плагины
  • Встроеный редактор
  • WiKi, markdown разметка
  • Перекрестные ссылки
  • Возможность сборки структуры и наполнения «Сайта» из исходников
Подбор железа под требования:
The Single Board Computer Database
В базе пока 270 железок…
Описание VoCore2
Может кому сгодиться…
Docker контейнер с CryptoPro 4 и nginx.
КриптоПро для linux надо достать скачать самому…
Обновленная инструкция…
Настройка nginx для работы с сертификатами ГОСТ 2012 года
Библиотека OpenSSL качается с update.cryptopro.ru/support/nginx-gost
Есть скрипт авто установки, но КриптоПро для linux надо достать скачать самому…

Как прокси работает…
Решение пока никак не дружит с nGinx Plus…
Если область действия сертификата содержит пробелы — надо экранировать строку параметр в конфиге nGinx правильно (ssl_certificate_key 'engine:gostengy: Петя Петров';)…

github.com/deemru/nginx — сборки обновляются, но только под Windows :-(

рекомендую заменить в скрипте фрагмент:
Старый фрагмент
if((Test-Path -Path C:\Windows\perfc) -eq $true)
{
try
{
Remove-Item -Path C:\Windows\perfc -Force -ea Stop
Write-Verbose -Message "File perfc was already exist" -Verbose
}
catch {Write-Verbose -Message "File perfc already fixed" -Verbose}
}

if((Test-Path -Path C:\Windows\perfc.dll) -eq $true)
{
try
{
Remove-Item -Path C:\Windows\perfc.dll -Force -ea Stop
Write-Verbose -Message "File perfc.dll was already exist" -Verbose
}
catch {Write-Verbose -Message "File perfc.dll already fixed" -Verbose}
}

if((Test-Path -Path C:\Windows\perfc.dat) -eq $true)
{
try
{
Remove-Item -Path C:\Windows\perfc.dat -Force -ea stop
Write-Verbose -Message "File perfc.dat was already exist" -Verbose
}
catch {Write-Verbose -Message "File perfc.dat already fixed" -Verbose}
}


на:
Новый фрагмент
$windows = $env:SystemRoot

$files = @("perfc","perfc.dll","perfc.dat")

$files | % {
if((Test-Path -Path "$windows\$_") -eq $true) {
try {
Remove-Item -Path "$windows\$_" -Force -ea Stop
Write-Verbose -Message "File [$windows\$_] was already exist" -Verbose
} catch {
Write-Verbose -Message "File [$windows\$_] already fixed" -Verbose
}
}

}


и
Старый фрагмент
$acl1 = Get-acl C:\Windows\Perfc
$acl2 = Get-acl C:\Windows\Perfc.dll
$acl3 = Get-acl C:\Windows\Perfc.dat

$acl1.SetAccessRuleProtection($true,$true)
$acl2.SetAccessRuleProtection($true,$true)
$acl3.SetAccessRuleProtection($true,$true)

$accrule1 = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\SYSTEM","FullControl","Deny")
$accrule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","FullControl","Deny")
$accrule3 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")
$accrule4 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")

$acl1.SetAccessRule($accrule1)
$acl1.SetAccessRule($accrule2)
$acl1.SetAccessRule($accrule3)
$acl1.SetAccessRule($accrule4)

$acl2.SetAccessRule($accrule1)
$acl2.SetAccessRule($accrule2)
$acl2.SetAccessRule($accrule3)
$acl2.SetAccessRule($accrule4)

$acl3.SetAccessRule($accrule1)
$acl3.SetAccessRule($accrule2)
$acl3.SetAccessRule($accrule3)
$acl3.SetAccessRule($accrule4)

Set-Acl -AclObject $acl1 -Path C:\Windows\Perfc -ea SilentlyContinue
Set-Acl -AclObject $acl2 -Path C:\Windows\Perfc.dll -ea SilentlyContinue
Set-Acl -AclObject $acl2 -Path C:\Windows\Perfc.dat -ea SilentlyContinue


на:
Новый фрагмент
$files | % {
try{
New-item -Path $windows -ItemType File -Name $_ -Force -ea Stop
}catch{Write-Verbose -Message "Dont need to create new files"}

}

Write-Verbose -Message "Successfully created" -Verbose

$files | % {
$acl = Get-acl "$windows\$_"
$acl.SetAccessRuleProtection($true,$true)

$accrule1 = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\SYSTEM","FullControl","Deny")
$accrule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","FullControl","Deny")
$accrule3 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")
$accrule4 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")

$acl.SetAccessRule($accrule1)
$acl.SetAccessRule($accrule2)
$acl.SetAccessRule($accrule3)
$acl.SetAccessRule($accrule4)

Set-Acl -AclObject $acl -Path "$windows\$_" -ea SilentlyContinue
}


Преимущества:
  • папка может оказаться сааавсем не Windows
  • быстрая замена имен файлов

P.S. фрагменты не тестировал!
рекомендую заменить в скрипте строчку (пример с Блога MSDN немного устарел):
$newProcess.Arguments = $myInvocation.MyCommand.Definition;

на
$newProcess.Arguments = '"'+$script:myInvocation.MyCommand.Definition +'"';

или (тут можно добавить параметры по вкусу):
$newProcess.Arguments = '-ExecutionPolicy RemoteSigned -File "' + $script:MyInvocation.MyCommand.Path + '"';


можно подписать файл скрипта (сертификат «можно купить»/«уже есть», или сделать самоподписанный):
function sign ($filename) {
$cert = gci cert:\currentuser\my -codesigning|Out-gridview -PassThru
$cert|fl
Set-AuthenticodeSignature $filename $cert
}

Может пригодиться:
Хранение настроек скрипта в файле
Хранение настроек скрипта в файле, после можно подписать файл скрипта, что бы избежать несанкционированного изменения скрипта…

#region Get setting from config
$myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
#$myDir = "$pwd\"
If (!(Test-Path $MyDir\Settings.xml))  {write-host 'Setting file ' $MyDir\Settings.xml ' not found..' -ForegroundColor Red ; exit}
[xml]$ConfigFile = Get-Content "$MyDir\Settings.xml"
if ($ConfigFile -eq $null) {write-host 'Setting file ' $MyDir\Settings.xml ' has error...' -ForegroundColor Red ; exit}

$global:Path2Export = $ConfigFile.Settings.Path2Export
$global:SecondsToSleep = $ConfigFile.Settings.SecondsToSleep
$global:ExportGroupName = $ConfigFile.Settings.ExportGroupName
$global:ExchangeServer = $ConfigFile.Settings.ExchangeServer
#endregion 

Пример XML
<?xml version="1.0"?>
<Settings>
  <Path2Export>\\FileServer.contoso.com\BackupPst$\</Path2Export>
  <ExportGroupName>ExportDisableUser2PST</ExportGroupName>   
  <SecondsToSleep>30</SecondsToSleep>
  <ExchangeServer>ExchangeServer.contoso.com</ExchangeServer>
</Settings>



Права на папку для бэкапа:
New-MailboxExportRequest
На расшаренную папку необходимо предоставить права группе «Exchange Trusted Subsystem»
You need to grant the following permission to the group Exchange Trusted Subsystem to the network share where you want to export or import PST files:
* To import PST files from the share: Read permission
* To save exported PST files to the share: Read/Write permission.


Ожидание окончания очереди, с выводом процента выполненного объема:
Фрагмент выдран, и немного причесан…
Рисует два прогресс бара для ящика и архивного ящика, если он есть.
Очереди называются по маске с именем пользователя, поэтому всегда можно увидеть кто выгружается и кто завершился с ошибкой…
$NameParamQueuedMailbox=@{Name="$ExportGroupName-$ADUser"}
$NameParamQueuedArchiving=@{Name="$ExportGroupName-$ADUser-archiving"}
#....
$isarchiving=Get-Mailbox -Identity $ADUser|select archivedatabase|% {if ($_.archivedatabase -eq $null) {$false} else {$true}} 
#...
#region Waiting status and show progress
do {
                #region Mailbox progressbar
                $StatusExport = get-MailboxExportRequest @NameParamQueuedMailbox | select  -ExpandProperty Status
                $MailboxPercent=get-MailboxExportRequest @NameParamQueuedMailbox | Get-MailboxExportRequestStatistics|select -ExpandProperty PercentComplete
                Write-Progress -id 1 -Activity "Export $ADUser Mailbox" -status "Status $StatusExport complite  $MailboxPercent percent" -percentComplete $MailboxPercent
                #endregion
                #region Archiving mailbox progressbar
                if ($isarchiving) {
                    $StatusExportArchiving = get-MailboxExportRequest @NameParamQueuedArchiving| select  -ExpandProperty Status
                    $archivingPercent=get-MailboxExportRequest @NameParamQueuedArchiving| Get-MailboxExportRequestStatistics|select -ExpandProperty PercentComplete
                    Write-Progress -Id 2 -ParentId 1 -Activity "Export $ADUser Archiving mailbox" -status "Status $StatusExportArchiving complite $archivingPercent percent" -percentComplete $archivingPercent
                } else {$StatusExportArchiving = 'Completed' }
                #endregion
                if ($StatusExport -eq 'Failed') {$StatusExport = 'Completed'} 
                if ($StatusExportArchiving -eq 'Failed' ) {$StatusExportArchiving = 'Completed'}
                if (($StatusExportArchiving -eq 'Completed') -and  ($StatusExport -eq 'Completed')) {$ExitWhile=$true} else {$ExitWhile=$false}
#Start-Sleep -s $SecondsToSleep #
   } while ($ExitWhile -ne $true)
#endregion

Дальше обязательная проверка на валидность окончания выгрузки, что бы случайно не удалить ящик пользователя у которого выгрузка завершилась с ошибкой и очистка выполненных очередей.

Запуск из/через CMD
<# :
  @echo off
    if '%1' == '' echo Please run %0 scrip with param - Username or email&&echo.&&echo %0 DisableUser&&exit

    set curentpath=%~dp0
    cd  /d %curentpath:~0,-1%

    powershell /nologo /noprofile /command ^
		 "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
#Ниже вставляем PowerShell Script
#$myDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$myDir = "$pwd\"

....


В копилку, пример на Perl:
@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15
print "Hello World\n";
__END__
:endofperl


У нас «почти» так и реализовано…
Есть «база», а-ля «телефонный справочник, c блэкджеком, учетом рабочего времени» — только кофе не готовит. В ней информация о сотрудниках. Обычные сотрудники могут только просматривать. Ответственные редактировать.
Есть скрипты для новых сотрудников, который добавляет записи и в AD, и в базу, и в Exchange.
Скриптами, так же, происходит обновление информации в AD из базы, по полям Employee или samaccountname.
Можно и не лишать службу поддержки хлеба насущного…
Set-OwaVirtualDirectory -id "owa (Default Web Site)" -SetPhotoEnabled $False

А также заблокировать изменение другой информации, для Exchange 2010…
Disabling editing account information in OWA
Позволяет заблокировать смену телефона, метоположения…

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity