Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Открыть новую тему     Написать ответ в эту тему

tcg2



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Microsoft Windows PowerShell

 
Обсуждаемые темы

    * Работа с SQL
    * Работа с Visual Studio
    * etc.

 
Помощь по использованию консоли pwsh, а также встроенной в Windows консоли powershell.exe  

Всего записей: 7 | Зарегистр. 20-11-2006 | Отправлено: 19:06 29-11-2006 | Исправлено: YuS 2, 18:04 02-06-2020
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Если честно не совсем вас понял.
в хосте набиваешь команды или запускаешь накатанный сценарий? если последнее, то пробовал:
Код:
start-process notepad.exe -wait
или нет? обычно срабатывает. если фокус все же потерян за счет сторонних программ, то следующей строкой в скрипте ищи окно хоста, либо примерно так:
Код:
$PSHandle = (Get-Process -id $pid).MainWindowHandle
, либо напрямую обратившись к объектам NET.

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 22:11 19-08-2011 | Исправлено: ComradG, 22:11 19-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Запускаю сценарий.
Wait пробовал. Дело в том что моя вызываемая програма открывает кучу диалоговоых окон где требуется нажимать кнопки, короче говоря там фокус теряется точно и до конца.
.MainWindowHandle буду пробовать, спасибо.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 22:44 19-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Спасибо за вектор.
В итоге раскопал скрипт  

Код:
 
Add-Type @"
  using System;
  using System.Runtime.InteropServices;
  public class Tricks {
     [DllImport("user32.dll")]
     [return: MarshalAs(UnmanagedType.Bool)]
     public static extern bool SetForegroundWindow(IntPtr hWnd);
  }
"@
sleep -sec 2
$h = (Get-Process firefox).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
sleep -sec 2
$h = (Get-Process -id $pid).MainWindowHandle
[void] [Tricks]::SetForegroundWindow($h)
 

Который как раз гоняет фокус по окнам.
 
Теперь у меня следующий вопрос:
После запуска приложения  

Код:
Start-process app.exe

app.exe открывает диалоговое окна (несколько штук, от 1 до 3)
и последнее окно имеет всегда один и тот же вид, это окно приглашения в программу с одной кнопкой ОК.
 
Что нужно:
1. запустить сценарий  
2. открыть из него app.exe
3. дождаться последнего окна и отловить нажатие на ОК
4. перевести фокус обратно в консоль
Все кроме 3 пункта я знаю как сделать.  
Боюсь что "дождаться" не получится, но отловить нажатие на кнопку мне вполне хватит.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 14:22 22-08-2011 | Исправлено: qik, 14:24 22-08-2011
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qik

Цитата:
3. дождаться последнего окна и отловить нажатие на ОК
здесь более вопрос по WinAPI: берешь Window Detective или Spy++ от M$, ищешь хэндл кнопки, - ну а дальше пишешь в скрипте обработчик для программного нажатия кнопки.

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:18 22-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Спасибо, буду разбираться.
 
Следующий вопрос
Есть домен в домене есть пользователи (с ограниченными правами на запись в c:/windows) и админы.
Я хочу запускать скрипты у пользователей с админскими правами, как я понимаю нужно использовать Credentials, но проблема в том, что провайдер FileSystem не работает.
Как мне имея админскую учетку (не перелогиневаясь в ОС) иметь возможность писать\удалять файлы в критических областях типа c:/windows ?

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 08:59 23-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
И если можно поподробнее про Spy++, никаких хендлов кнопок я там не нашел. Только идентификаторы которые меняются от раза в раз.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 11:11 23-08-2011
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qik
прошу прощения, я малость напутал: не хэндлы, а заголовки контрола, - в твоем случае батона "ОК".

Цитата:
что провайдер FileSystem не работает.
???

Цитата:
Как мне имея админскую учетку...
с админской учеткой вообще-то это можно делать, если не были изменены права доступа. может ты имел в виду гостя, то тогда примерно так:
Код:
runas /noprofile /user:DOMAIN\USER /env powershell.exe
, - либо повышай привелегии используя уязвимость в win32k.sys

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 16:38 23-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Нашел код который идеально подошел для моих целей  
 

Код:
using System;
using System.Runtime.InteropServices;
class TestProgram
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_LBUTTONUP = 0x0202;
    static void Main()
    {
        // находим окно калькулятора, зная window class ("SciCalc")
        IntPtr calcWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "SciCalc", null);
        // находим кнопку по имени окна ("1") и имени класса ("Button")
        IntPtr button1 = FindWindowEx(calcWnd, IntPtr.Zero, "Button", "1");
        // если нашли
        if(button1 != IntPtr.Zero)
        {
            // посылаем нажатие кнопки мыши, последний параметр
            // содержит координаты мыши (скопировано из Spy++)
            SendMessage(button1, WM_LBUTTONDOWN, 1, 0x150018);
            SendMessage(button1, WM_LBUTTONUP, 0, 0x150018);
        }
    }
}
 

 
но переписать его в powershell не получается.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 17:24 23-08-2011
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qik
CSharpCodeProvider тебе ни о чем не говорит? от себя могу добавить пример:
Код:
#скрыть окно консоли при запуске сценария
function HideConsoleWindow {
  $cscp = New-Object Microsoft.CSharp.CSharpCodeProvider
  $cpar = New-Object CodeDom.Compiler.CompilerParameters
 
  $hideWindow = 0x0080
 
  $code = 'using System;
  using System.Runtime.InteropServices;
 
  namespace MyLibrary
  {
    public class Window
    {
      [DllImport("user32.dll")]
      public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
                                      int x, int y, int cx, int cy, uint uFlags);
    }
  }'
 
  $cscp.CompileAssemblyFromSource($cpar, $code)
  $PSHandle = (Get-Process -id $pid).MainWindowHandle
  [MyLibrary.Window]::SetWindowPos($PSHandle, 0, 0, 0, 0, 0, $hideWindow)
}

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:52 23-08-2011 | Исправлено: ComradG, 17:57 23-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Спасибо.
А код для скрытия консоли зачем? То есть я понимаю что он делает, но я вроде не спрашивал про скрытие окон.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 08:28 24-08-2011
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
qik

Цитата:
А код для скрытия консоли зачем?
как пример. по ссылке выше пример компиляции экзешника, а я привел пример компиляции dll с ее последущим вызовом. неужели так трудно было догадаться? чем больше примеров, тем ведь проще разбираться

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:15 24-08-2011
qik



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ComradG
Точно-точно, согласен!
 
Как связке с# и powershell отследить нажатие пользователем на кнопке в программе?
Грубо говоря используя код про Калькулятор (выше есть в моем комменте) сделать примерно то же самое только не программно кликать и тупо следить за кнопкой и если она нажата выдать сообщение.

Всего записей: 473 | Зарегистр. 10-01-2004 | Отправлено: 14:10 25-08-2011
VseNikiZaniatiBlin

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята привет. Не знаю.. угадал ли тему.
В общем имеется скрипт для повершела.

Код:
 
############################################################
Write-Host "Загрузка оснастки Active Directory."
#Add-PSSnapin Quest.ActiveRoles.ADManagement
 
#Функция для чистки входных строк от двойных кавычек
function ClearString ([string]$str){
 
    $str = $str -Replace ' {2,}',''
    $str = $str.TrimStart()
    $str = $str.TrimStart()
 
    $str = $str -Replace """""","@"
    $str = $str -Replace """",""
    $str = $str -Replace "@",""""
 
return $str;
 
}
 
$FileATS = "C:\TEST\FINAL\AD_atribut.csv"
$ADSearchRoot = "ru.domen.com/OU/Users"
$pw = read-host "Enter password" -AsSecureString
 
Connect-QADService -ConnectionAccount "ru.domen.com\Administrator" -ConnectionPassword $pw
 
$Employes = Get-Content $FileATS
$TotalUsrs = 0
$UpdatedUsrs = 0
foreach ($Emp in $Employes)
{    
    $TotalUsrs++
 
    $FullName = $Emp.split(';')[0]
      $Org = $Emp.split(';')[1]
    $Dep = $Emp.split(';')[2]
     $Title = $Emp.split(';')[3]
    $IntMobTel = $Emp.split(';')[4]
       $IntStTel = $Emp.split(';')[5]
#        $Manag = $Emp.split(';')[4]
#    $Gorod = $Emp.split(';')[5]
#       $Obl = $Emp.split(';')[6]
#       $Country = $Emp.split(';')[7]
#    $Kabinet = $Emp.split(';')[7]
 
 
    $FullName = ClearString($FullName)
     $Org = ClearString($Org)
     $Dep = ClearString($Dep)
    $Title = ClearString($Title)
    $IntMobTel = ClearString($IntMobTel)
       $IntStTel = ClearString($IntStTel)
#    $Manag = ClearString($Manag)
#     $Gorod = ClearString($Gorod)
#    $Obl = ClearString($Obl)
#      $Country = ClearString($Country)
#    $Kabinet = ClearString($Kabinet)
 
    if ($CurUser = Get-QADUser -SearchRoot $ADSearchRoot -displayName $FullName)  
    {    
        "Пользователь $FullName найден..."
        if (@($CurUser).count -gt 1) {
        "Есть полные тезки, пропускаем!"
        continue
        }
        $CurUser | Set-QADUser -Company "$Org" -Department "$Dep" -Title "$Title" -mobile "$IntMobTel" -telephoneNumber "$IntStTel"
        "обновлён."
        $UpdatedUsrs++     
    }
}
"Всего пользователей в файле: $TotalUsrs"
"Обновлено пользователей в AD: $UpdatedUsrs"
############################################################
 

Автор кода:    Andrey Orlov
 
С помощью него делаем выгрузку из 1с зарплаты в AD
Собственно интересует вопрос можно ли сделать так чтобы в конце скрипта когда пишет:
 
Всего пользователей в файле: 412
Обновлено пользователей в AD: 274
 
Чтобы была информация кого он не смог загрузить и причина (лог файл какойнить). Если причину указать не реально то просто кого не смог загрузить

Всего записей: 19 | Зарегистр. 02-10-2011 | Отправлено: 10:04 30-11-2011 | Исправлено: VseNikiZaniatiBlin, 11:26 30-11-2011
Baggurd

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что я делаю не так?  
Взял скрипт отсюда http://www.howtogeek.com/50187/how-to-create-multiple-users-in-server-2008-with-powershell/  
 
тупо скопировал его
поменял домен
$objOU=[ADSI]“LDAP://OU=abc,DC=contoso,DC=com”
$dataSource=import-csv “users.csv”
foreach($dataRecord in $datasource) {
$cn=$dataRecord.FirstName + ” ” + $dataRecord.LastName
$sAMAccountName=$dataRecord.FirstName + “.” + $dataRecord.LastName
$givenName=$dataRecord.FirstName
$sn=$dataRecord.LastName
$sAMAccountName=$sAMAccountName.ToLower()
$displayName=$sn + “, ” + $givenName
$userPrincipalName=$sAMAccountName + “@contoso.com”
$objUser=$objOU.Create(“user”,”CN=”+$cn)
$objUser.Put(“sAMAccountName”,$sAMAccountName)
$objUser.Put(“userPrincipalName”,$userPrincipalName)
$objUser.Put(“displayName”,$displayName)
$objUser.Put(“givenName”,$givenName)
$objUser.Put(“sn”,$sn)
$objUser.SetInfo()
$objUser.SetPassword(“P@assw0rd”)
$objUser.psbase.InvokeSet(“AccountDisabled”,$false)
$objUser.SetInfo()
}
 
так выглядит csv
FirstName;LastName
Avis;Flamm
Kurt;Pharris
 
 
В результате получаю кучу ошибок
 
Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов
"
C:\ADscripts\testscript.ps1:11 знак:23
+ $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:15 знак:13
+ $objUser.Put <<<< (“givenName”,$givenName)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:16 знак:13
+ $objUser.Put <<<< (“sn”,$sn)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:17 знак:17
+ $objUser.SetInfo <<<< ()
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:18 знак:21
+ $objUser.SetPassword <<<< (“P@assw0rd”)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше.
"
C:\ADscripts\testscript.ps1:19 знак:26
+ $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodTargetInvocation
 
Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:20 знак:17
+ $objUser.SetInfo <<<< ()
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "Create" с "2" аргументами: "Был передан недопустимый путь службы каталогов
"
C:\ADscripts\testscript.ps1:11 знак:23
+ $objUser=$objOU.Create <<<< (“user”,”CN=”+$cn)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:15 знак:13
+ $objUser.Put <<<< (“givenName”,$givenName)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "Put" с "2" аргументами: "Неопознанная ошибка (Исключение из HRESULT: 0x80004005 (E_FAIL))"
C:\ADscripts\testscript.ps1:16 знак:13
+ $objUser.Put <<<< (“sn”,$sn)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:17 знак:17
+ $objUser.SetInfo <<<< ()
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "SetPassword" с "1" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:18 знак:21
+ $objUser.SetPassword <<<< (“P@assw0rd”)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI
 
Исключение при вызове "InvokeSet" с "2" аргументами: "Свойства службы каталогов не могут быть найдены в кэше.
"
C:\ADscripts\testscript.ps1:19 знак:26
+ $objUser.psbase.InvokeSet <<<< (“AccountDisabled”,$false)
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodTargetInvocation
 
Исключение при вызове "SetInfo" с "0" аргументами: "Указан недопустимый dn-синтаксис. (Исключение из HRESULT: 0x80072032)"
C:\ADscripts\testscript.ps1:20 знак:17
+ $objUser.SetInfo <<<< ()
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : CatchFromBaseAdapterMethodInvokeTI

Всего записей: 22 | Зарегистр. 28-12-2008 | Отправлено: 15:13 27-12-2011
konst2k6

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw "$env:ProgramFiles\7-Zip\7z.exe needed"}
set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"
 
sz a -tzip "D:\test1.zip" "D:\Bases\v82\20120110"
sz a -tzip "D:\test2.zip" "D:\Bases\v82\20120111"

Добрый день!
 
Подскажите как можно сделать. Мне нужно к имени архива добавлять текущую дату вида ГГГГММДД, т.е. архив должен создаваться с именем, например: test1_20120117.zip. Сильно смущают кавычки в имени файла архива.

Всего записей: 52 | Зарегистр. 24-03-2006 | Отправлено: 10:48 17-01-2012
Freiberufler2

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2konst2k6
Лови живой скрипт Win7 x64 ps v2  
#create/restore backup file with datestamp in archive name
dir 'C:\path-to-archive\*.*'  -include 'MyDocs_backup*.rar'| Remove-Item  #delete old archives
$cmnparam = '"C:\Program files\winrar\rar.exe" a -ag[yyyy-mm-dd] -s -ri1 -mt2 -m0 -r '+
' "C:\path-to-archive\MyDocs_backup.rar" ' +
' @"C:\path-to-extent-2-archiving-files\bak.txt" '
(new-object -ComObject WScript.Shell).Run($cmnparam,1,$True)|Out-Null # waiting OK
 
<#bak.txt
"C:\path-to-files\*.rar"  
#>
 

Всего записей: 116 | Зарегистр. 12-01-2007 | Отправлено: 13:55 17-01-2012
konst2k6

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
спасибо конечно. но логика работы скрипта изначально проблем не вызывает да и winrar не подходит, т.к. пользуемся бесплатным продуктом. сложность именно с добавлением даты в имя создаваемого архива.

Всего записей: 52 | Зарегистр. 24-03-2006 | Отправлено: 15:14 17-01-2012
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
konst2k6
а не проще ли воспользоваться командлетом Get-Date (благо тот обладет большим количеством параметров), загнав полученные данные в переменную типа string, а после передавать эту переменную далее по конвееру?

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 15:47 17-01-2012
konst2k6

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
говорю же. )) с логикой проблем нет. )) проблема со вставкой переменной в кавычки. ))

Всего записей: 52 | Зарегистр. 24-03-2006 | Отправлено: 16:46 17-01-2012
ComradG



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
konst2k6
дык а я про что? вынеси дату в переменную и через foreach штампуй файлы.

Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 18:13 17-01-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru