none
Вернуть список баз 1С на ПК пользователей. RRS feed

  • Вопрос

  • Доброго времени суток Уважаемые коллеги!

    Есть 200 ПК и на них установлен клиент 1С. У всех пользователей свои персонализированные настройки списка баз 1с.

    Задача: вернуть список всех персонализированных информационных баз на ПК, которые присутствуют в пути профиля C:\Users\Vasya.IV\AppData\Roaming\1C\1CEStart\ и далее в файлике ibases.v8i  список всех информационных баз.

    Я так понимаю необходимо использовать командлет Get-Adcomputer совместно с Get-ChieldItem , но вот как представить вывод , если у всех пользователей в личном профиле этот файл с одинаковым именем ?

    Может кто подскажет, или уже проделывал такое ?

    Спасибо!


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 11:46

Ответы

  • у таких задач всегда есть 2 типа решения:

    - "со стороны сервера" вы можете пойти по списку ПК и со всех "доступных" вытянуть информацию. В таком случае вы получите ответ относительно быстро но ответ будет не полным

    - "со стороны клиентов" вы можете выгрузить список баз (при помощи GPO или SCCM) в одну серверную шару и потом (через пару дней) получить более полный список проанализировав шару

    Имхо второй вариант более правильный по умолчанию но занимает намного больше времени до финального результата

    насколько я помню конфиг 1с это текстовый файл с определенной структурой и там хранятся не только настройки баз

    Если хотите собрать одинаковые файлы в одно место то можете использовать переименование файлов добавляя $computername и $username в имя файла

    пример:

    $computers = Get-ADComputer -Filter * -SearchBase "OU=client computers,DC=domain,DC=com"
    $ErrorActionPreffence = 'Stop'
    foreach ($computer in $computers){
       if (Test-Connection $computer.Name){
          try {
             $BasicPath = "\\$($Computer.name)\C`$\Users\"
             Get-ChildItem "$BasicPath" -Directory | Foreach {
                $User = $_
                $OneCConfigPath = "$BasicPath\$User\AppData\Roaming\1C\1CEStart\ibases.v8i"
                if (test-path $OneCConfigPath){
                   Copy-Item $OneCConfigPath -Destination "\\ServerName\ShareName\$computer`_$user`_ibases.v8i"
                }
             }
          }catch {
             Write-Host "Copy-Item failed for $user on a $computer with error $_" -ForegroundColor Red
          }
       } else {
          write-host "Coputer $computer not pingable"
       }
    } # End foreach

    Если хотите парсить и на выходе получать список баз с припиской пользователя и пк вместо Copy-Item можете использовать

    $content = Get-Content $OneCContentFile | Out-String 

    после чего при помощи select вы можете модифицировать вывод и добавить необходимые свойства к выводу

    "" | select @{n="ComputerName";e={$Computer.Name}}, @{n="UserName";e={$User}},@{n="FileContent";e={$Content}}

    Так же вы можете в блок e={} добавлять массивы

    $DBs = $Content -split '\r\n' | foreach {if {$_ -match 'DB=(?''dbname''.+)'){$Matches['dbname']}

    "" | select @{n="ComputerName";e={$Computer.Name}}, @{n="UserName";e={$User}},@{n="DataBases";e={$DBs}}

    -match это абстрактный пример так как реального файла вы не показали а искать в интернете пример файла сильно лень



    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Sergey Korotkov 6 мая 2020 г. 13:07
    • Изменено Vector BCOModerator 12 мая 2020 г. 11:10 обчепятки
    • Помечено в качестве ответа Vector BCOModerator 13 мая 2020 г. 2:52
    Модератор
  • $computers = Get-ADComputer -Filter * -SearchBase "OU=client computers,DC=domain,DC=com"
    $ErrorActionPreffence = 'Stop'
    $ScriptOutput = foreach ($computer in $computers){
       if (Test-Connection $computer.Name){
            try {
                $BasicPath = "\\$($Computer.name)\C`$\Users\"
                Get-ChildItem "$BasicPath" -Directory | Foreach {
                    $User = $_
                    $OneCConfigPath = "$BasicPath\$User\AppData\Roaming\1C\1CEStart\ibases.v8i"
                    if (Test-Path $OneCConfigPath){
                        Get-Content $OneCConfigPath | Foreach {
                            if ($_ -match 'Connect=Srvr="(?''ServerName''[^"]+)";Ref="(?''BaseName''[^"]+)"'){
                                '' | select @{n='UserName';e={$User}}, `
                                            @{n='ComputerName';e={$computer.Name}}, `
                                            @{n = 'ServerName';e={$Matches['ServerName']}}, `
                                            @{n = 'BaseName';e={$Matches['BaseName']}} | Where {$_.BaseName -notin @('BuhSp','Kazna','ogo','ProdTest')}
                            } # End If
                        }
                    } else {
                        Write-Host "[$($computer.name)] Not found 1c config file for '$User' user" -ForegroundColor Yellow
                    }
                } # End foreach
            }catch {
                Write-Host "Something failed while getting info for $user on a $computer. Error $_" -ForegroundColor Red
            }
        } else {
           write-host "Computer '$computer' is not pingable" -ForegroundColor Yellow
        }
    } # End foreach
    
    # Групировка по пользователям
    $ScriptOutput | Group-Object UserName
    # Групировка по ПК
    $ScriptOutput | Group-Object ComputerName
    # Получение уникальных названий баз
    $ScriptOutput.BaseName | Select -Unique
    # Сохранение всего в пр=лоском формате 
    $ScriptOutput | Export-Csv C:\TMP\1cDatabases.csv -Delimiter ';'
    # Вывод в читаемом формате с возможностью поиска и фильтрации
    $ScriptOutput | Out-GridView



    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 11 мая 2020 г. 19:05
    • Помечено в качестве ответа Vector BCOModerator 13 мая 2020 г. 2:48
    Модератор

Все ответы

  • Здравствуйте. Не особо понял, а вернуть откуда ? У Вас какая-то миграция с сервера на сервер или что ? Почему просто нельзя его скопировать ?
  • у таких задач всегда есть 2 типа решения:

    - "со стороны сервера" вы можете пойти по списку ПК и со всех "доступных" вытянуть информацию. В таком случае вы получите ответ относительно быстро но ответ будет не полным

    - "со стороны клиентов" вы можете выгрузить список баз (при помощи GPO или SCCM) в одну серверную шару и потом (через пару дней) получить более полный список проанализировав шару

    Имхо второй вариант более правильный по умолчанию но занимает намного больше времени до финального результата

    насколько я помню конфиг 1с это текстовый файл с определенной структурой и там хранятся не только настройки баз

    Если хотите собрать одинаковые файлы в одно место то можете использовать переименование файлов добавляя $computername и $username в имя файла

    пример:

    $computers = Get-ADComputer -Filter * -SearchBase "OU=client computers,DC=domain,DC=com"
    $ErrorActionPreffence = 'Stop'
    foreach ($computer in $computers){
       if (Test-Connection $computer.Name){
          try {
             $BasicPath = "\\$($Computer.name)\C`$\Users\"
             Get-ChildItem "$BasicPath" -Directory | Foreach {
                $User = $_
                $OneCConfigPath = "$BasicPath\$User\AppData\Roaming\1C\1CEStart\ibases.v8i"
                if (test-path $OneCConfigPath){
                   Copy-Item $OneCConfigPath -Destination "\\ServerName\ShareName\$computer`_$user`_ibases.v8i"
                }
             }
          }catch {
             Write-Host "Copy-Item failed for $user on a $computer with error $_" -ForegroundColor Red
          }
       } else {
          write-host "Coputer $computer not pingable"
       }
    } # End foreach

    Если хотите парсить и на выходе получать список баз с припиской пользователя и пк вместо Copy-Item можете использовать

    $content = Get-Content $OneCContentFile | Out-String 

    после чего при помощи select вы можете модифицировать вывод и добавить необходимые свойства к выводу

    "" | select @{n="ComputerName";e={$Computer.Name}}, @{n="UserName";e={$User}},@{n="FileContent";e={$Content}}

    Так же вы можете в блок e={} добавлять массивы

    $DBs = $Content -split '\r\n' | foreach {if {$_ -match 'DB=(?''dbname''.+)'){$Matches['dbname']}

    "" | select @{n="ComputerName";e={$Computer.Name}}, @{n="UserName";e={$User}},@{n="DataBases";e={$DBs}}

    -match это абстрактный пример так как реального файла вы не показали а искать в интернете пример файла сильно лень



    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Sergey Korotkov 6 мая 2020 г. 13:07
    • Изменено Vector BCOModerator 12 мая 2020 г. 11:10 обчепятки
    • Помечено в качестве ответа Vector BCOModerator 13 мая 2020 г. 2:52
    Модератор
  • Да, это переезд со старых серверов 1с на новые.в

    В общей шаре уже есть список баз и он уже настроен на терминальниках и такое же можно настроить через GPO на ПК, но есть одно но. Получается что к персонализированному списку баз у каждого пользователя в профиле, что на терминале, что на его ПК, добавляется список дублирующих баз, но уже с общей шары. До переезда но новое имя кластера будет работать и в персонализированных и в общих, но после переезда, кластерное имя будет отличатся. То есть пользователи будут по ошибке запускать свои привычные базы с указанным исходным кластером и получать ошибку запуска 1с.

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

    Вариант 1. Написать инструкцию как самим пользователям убрать список исходных баз из клиента- но это шквал заявок на тех.поддержку, потому что половина этого не сделает.

    Вариант2. В ручную... но долго и муторно.

    Вариант 3. Как то автоматизировать процесс вида пройтись по всем ПК и собрать список баз у пользователей до переезда на новый кластер 1С


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 12:37
  • если названия будут такими же но будут отличаться пути то просто поменяйте 1 известный путь на другой через replace в имеющемся у пользюка файле

    сравнивание массивов это конечно занимательно но этой ситуации имхо абсолютно ненужное занятие


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • если названия будут такими же но будут отличаться пути то просто поменяйте 1 известный путь на другой через replace в имеющемся у пользюка файле

    сравнивание массивов это конечно занимательно но этой ситуации имхо абсолютно ненужное занятие


    The opinion expressed by me is not an official position of Microsoft

    Будет отличаться имя кластера 1с сервера. То есть если его как то удастся заменить на персонализированных тогда это минус еще проблема. Ну тут менять надо в каждом файле iBases- а там по 7-8 списков баз и у каждого он разный. Пускай будет набор из баз которые лежат на общей шаре + свои базы - но с одним и тем же именем нового кластера 1с. 

    Позже это уже можно разгрести.

     

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    • Изменено rеstless 6 мая 2020 г. 12:44
  •  

    Будет отличаться имя кластера 1с сервера. То есть если его как то удастся заменить на персонализированных тогда это минус еще проблема. Ну тут менять надо в каждом файле iBases- а там по 7-8 списков баз и у каждого он разный. Пускай будет набор из баз которые лежат на общей шаре + свои базы - но с одним и тем же именем нового кластера 1с. 

    Позже это уже можно разгрести.


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    можно конечно, вопрос затраченного времени и стабильности решения. Не утверждаю что то что вы придумали хуже моего предложения, просто высказал мнение что еще можно сделать заменой 1 имени на другое например через логон скрипт :)

    если ответ данный выше вас удовлетворяет не полностью то пожалуйста уточните вопрос


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • если названия будут такими же но будут отличаться пути то просто поменяйте 1 известный путь на другой через replace в имеющемся у пользюка файле

    сравнивание массивов это конечно занимательно но этой ситуации имхо абсолютно ненужное занятие


    The opinion expressed by me is not an official position of Microsoft

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

    Проще говоря, как поменять это имя для каждого пользователя в списках конфигурационного файла баз ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 13:23
  • если названия будут такими же но будут отличаться пути то просто поменяйте 1 известный путь на другой через replace в имеющемся у пользюка файле

    сравнивание массивов это конечно занимательно но этой ситуации имхо абсолютно ненужное занятие


    The opinion expressed by me is not an official position of Microsoft

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

    Проще говоря, как поменять это имя для каждого пользователя в списках конфигурационного файла баз ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    в стиле Одесского диалога: "а как выглядит то что вы собираетесь менять и то на что вы это собираетесь менять?"

    у меня нет файла перед глазами да и 1с я последний раз видел лет 5 назад. Покажите пример файла и покажите какие конкретно строки вы хотите заменить и на что

    $(get-content $oneCConfigPath) -replace "old 1c server name","new 1c cluster name" | set-content $oneCConfigPath
    если без бантиков и фантиков задача сводится ванлайнеру, но можно докидать еше с пару тройку if'ов чтоб было красиво и все получают профит


    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Alexander RusinovModerator 6 мая 2020 г. 13:57
    • Изменено Vector BCOModerator 12 мая 2020 г. 11:09 покажЫте заменено на покажитЕ
    • Отменено предложение в качестве ответа Vector BCOModerator 13 мая 2020 г. 2:51
    • Предложено в качестве ответа Vector BCOModerator 22 мая 2020 г. 21:04
    Модератор
  • [1C Бухгалтерия]
    Connect=Srvr="db02";Ref="buhsp";
    ID=277e1d74-5e10-4196-a1c7-33492bf432cd
    OrderInList=16384
    Folder=/
    OrderInTree=256
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.2
    [1С Казначейство]
    Connect=Srvr="server";Ref="kazna";
    ID=93555233-696d-4ae1-9344-1d92014668ad
    OrderInList=16450.3703703704
    Folder=/
    OrderInTree=98560
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.3
    [1C Управление продажами]
    Connect=Srvr="server";Ref="prodTest";
    ID=acd93d3f-00a3-45bd-bcb2-42ac1c8798c0
    OrderInList=16640
    Folder=/
    OrderInTree=16640
    External=0
    ClientConnectionSpeed=Normal
    App=ThickClient
    WA=1
    Version=8.2
    DefaultApp=ThickClient
    [1С ОГО]
    Connect=Srvr="server";Ref="ogo";
    ID=982154ed-f727-404a-bb51-592e748e110f
    OrderInList=16896
    Folder=/
    OrderInTree=131328
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.3
    Параметр Connect=Srvr="  " - это имя кластера, соответственно имена DB02 и Server необходимо заменить на SD-APP-01 

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 13:58
  • О! разговор начинает быть предметным :)

    Тот пример который вы привели я записай в файл C:\TMP\1cConfig и выполнил следующий ванлайнер

    (Get-Content C:\TMP\1cConfig ) -replace 'Srvr="(db02|server)"','Srvr="SD-APP-01"' | Out-File  C:\TMP\1cConfig

    В результате чего получил следующее:

    [1C Бухгалтерия]
    Connect=Srvr="SD-APP-01";Ref="buhsp";
    ID=277e1d74-5e10-4196-a1c7-33492bf432cd
    OrderInList=16384
    Folder=/
    OrderInTree=256
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.2
    [1С Казначейство]
    Connect=Srvr="SD-APP-01";Ref="kazna";
    ID=93555233-696d-4ae1-9344-1d92014668ad
    OrderInList=16450.3703703704
    Folder=/
    OrderInTree=98560
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.3
    [1C Управление продажами]
    Connect=Srvr="SD-APP-01";Ref="prodTest";
    ID=acd93d3f-00a3-45bd-bcb2-42ac1c8798c0
    OrderInList=16640
    Folder=/
    OrderInTree=16640
    External=0
    ClientConnectionSpeed=Normal
    App=ThickClient
    WA=1
    Version=8.2
    DefaultApp=ThickClient
    [1С ОГО]
    Connect=Srvr="SD-APP-01";Ref="ogo";
    ID=982154ed-f727-404a-bb51-592e748e110f
    OrderInList=16896
    Folder=/
    OrderInTree=131328
    External=0
    ClientConnectionSpeed=Normal
    App=Auto
    WA=1
    Version=8.3

    Вам остается сделать бекап конфига перед изменением (на случай если все пойдет плохо), и пример преукрасить ифами (проверка есть ли файл по пути $env:USERPROFILE\AppData\... если есть - применить ванлайнер, если нет - то не делать ничего и тд. и повесить этот мега скрипт на логон что-б у каждого пользюка он при релогоне отработал

    конечно перед этим стоит проверить что все корректно работает на кроликах


    The opinion expressed by me is not an official position of Microsoft



    Модератор
  • Мда, просто чума!)

    То есть я так понимаю мы берем любой исходный ibases.v8i и применяем к нему ванлайнер ? Далее этот скрипт засовываем в GPO логон скрипта ?

    (Get-Content C:\TMP\ibases.v8i ) -replace 'Srvr="(db02|server)"','Srvr="SD-APP-01"' | Out-File  C:\TMP\ibases.v8i
    А те базы которые из общей шары, в принципе менять имя кластера что там , что скриптом все равно ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • Мда, просто чума!)

    То есть я так понимаю мы берем любой исходный ibases.v8i и применяем к нему ванлайнер ? Далее этот скрипт засовываем в GPO логон скрипта ?

    (Get-Content C:\TMP\ibases.v8i ) -replace 'Srvr="(db02|server)"','Srvr="SD-APP-01"' | Out-File  C:\TMP\ibases.v8i
    А те базы которые из общей шары, в принципе менять имя кластера что там , что скриптом все равно ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    по идее все так :)


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Но тут осталось только одно, узнать сколько и у кого тестовых баз, если мы сделаем боевые то поедут тестовые (их перевозим позже) и они не будут работать, а тестовые базы то же критичны, у нас во всяком случае. Поэтому первоначально все равно отрабатывать скрипт. Так хоть будет понятно у кого и сколько их.

    Но за идею все равно спасибо!


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!




    • Изменено rеstless 6 мая 2020 г. 15:54
  • День добрый.

    Под похожую задачу писал пару функций:

    https://1drv.ms/u/s!Aiewh6AC1UWksZluHB3y1MvR6ct3_w

    Может быть натолкнёт на мысль.

    Задача была такая. Конфиг (*.v8i) лежит в шаре - дописать путь к конфигу в пользовательский 1CEStart.cfg


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

  • День добрый.

    Под похожую задачу писал пару функций:

    https://1drv.ms/u/s!Aiewh6AC1UWksZluHB3y1MvR6ct3_w

    Может быть натолкнёт на мысль.

    Задача была такая. Конфиг (*.v8i) лежит в шаре - дописать путь к конфигу в пользовательский 1CEStart.cfg


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    если есть прототип можно скооперироваться на github и сделать универсальный проект который будет использоваться во многих компаниях

    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Самый верхний скрипт не арбайтен:


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 21:10
  • Самый верхний скрипт не арбайтен:


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    попробуйте $computer.name вместо просто $computer

    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Интересно а что это за параметр -Folder? Ошибку выдает.

    Get-ChildItem "$BasicPath" -Folder 

    with error A parameter cannot be found that matches parameter name 'Folder'


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 6 мая 2020 г. 22:25
  • Интересно а что это за параметр -Folder? Ошибку выдает.

    Get-ChildItem "$BasicPath" -Folder 

    with error A parameter cannot be found that matches parameter name 'Folder'


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    это -Directory с опечатками

    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Да я все параметры перепробовал в том числе и этот, ситуация не меняется:

    Get-ChildItem : Cannot find path '\\CN=DESK-02,OU=TestPC,DC=GB,DC=SD,DC=LOCAL\C$\Users\' because it does not exist.
    At C:\scripts\get1CBase.ps1:7 char:10
    +          Get-ChildItem "$BasicPath" -Directory | Foreach {
    +          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (\\CN=DESK-02,OU...LOCAL\C$\Users\:String) [Get-ChildItem], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • Да я все параметры перепробовал в том числе и этот, ситуация не меняется:

    Get-ChildItem : Cannot find path '\\CN=DESK-02,OU=TestPC,DC=GB,DC=SD,DC=LOCAL\C$\Users\' because it does not exist.
    At C:\scripts\get1CBase.ps1:7 char:10
    +          Get-ChildItem "$BasicPath" -Directory | Foreach {
    +          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (\\CN=DESK-02,OU...LOCAL\C$\Users\:String) [Get-ChildItem], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    $BasicPath = "\\$($Computer.Name)\C`$\Users\"

    Поменяйте определение $BasicPath на это

    уже поправил в оригинальном сообщении


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • Да я все параметры перепробовал в том числе и этот, ситуация не меняется:

    Get-ChildItem : Cannot find path '\\CN=DESK-02,OU=TestPC,DC=GB,DC=SD,DC=LOCAL\C$\Users\' because it does not exist.
    At C:\scripts\get1CBase.ps1:7 char:10
    +          Get-ChildItem "$BasicPath" -Directory | Foreach {
    +          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (\\CN=DESK-02,OU...LOCAL\C$\Users\:String) [Get-ChildItem], ItemNotFoundException
        + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    $BasicPath = "\\$($Computer.Name)\C`$\Users\"

    Поменяйте определение $BasicPath на это

    уже поправил в оригинальном сообщении


    The opinion expressed by me is not an official position of Microsoft


    Да, спасибо, работает. 


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • Да, спасибо, работает. 


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    Если вопрос решен, отметьте пожалуйста ответы которые были вам полезны

    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Интересно а по контенту файлов можно найти с приставкой *test, ну дабы каждый файл не открывать и не искать там в списке базы с именем test_basa ?

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 7 мая 2020 г. 8:58
  • что б получить просто строки в которых упоминается test можно использовать select-string -path $PathToConfig -Pattern "test"

    если вам нужны не просто строки а именно названия баз то можно найти и их. к примеру если название базы это ref="YourBaseName" то получить YourBaseName можно так

    get-content $PathToConfig | foreach { if ($_ -match 'ref="(?''BaseName''[^"]+)"'){$Matches['BaseName']}} 


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • что б получить просто строки в которых упоминается test можно использовать select-string -path $PathToConfig -Pattern "test"

    если вам нужны не просто строки а именно названия баз то можно найти и их. к примеру если название базы это ref="YourBaseName" то получить YourBaseName можно так

    get-content $PathToConfig | foreach { if ($_ -match 'ref="(?''BaseName''[^"]+)"'){$Matches['BaseName']}} 


    The opinion expressed by me is not an official position of Microsoft


    Я так понимаю данный скрипт нужно выполнять уже после основного, или в его содержание можно вставить ?

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • Вот что надо 

    вывести список из строк начинающихся с connect не содержащих имена из массива строк 'buhsp','hrm20','kazna','ogo' - все кроме входящих в массив названий рабочих баз - так будет надежнее.

    Так можно сделать ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    • Изменено rеstless 7 мая 2020 г. 9:49
  • Вот что надо 

    вывести список из строк начинающихся с connect не содержащих имена из массива строк 'buhsp','hrm20','kazna','ogo' - все кроме входящих в массив названий рабочих баз - так будет надежнее.

    Так можно сделать ?


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!


    Попробуйте что-то типа такого

    $computers = Get-ADComputer -Filter * -SearchBase "OU=client computers,DC=domain,DC=com"
    $ErrorActionPreffence = 'Stop'
    foreach ($computer in $computers){
       if (Test-Connection $computer.Name){
            try {
                $BasicPath = "\\$($Computer.name)\C`$\Users\"
                $DBsAndServers = @()
                Get-ChildItem "$BasicPath" -Directory | Foreach {
                    $User = $_
                    $OneCConfigPath = "$BasicPath\$User\AppData\Roaming\1C\1CEStart\ibases.v8i"
                    if (Test-Path $OneCConfigPath){
                        Get-Content $OneCConfigPath | Foreach {
                            if ($_ -match 'Connect=Srvr="(?''ServerName''[^"]+)";Ref="(?''BaseName''[^"]+)"'){
                                $DBsAndServers += '' | select @{n = 'ServerName';e={$Matches['ServerName']}},@{n = 'BaseName';e={$Matches['BaseName']}}
                            }
                        }
                        '' | Select @{n='UserName';e={$User}},@{n='ComputerName';e={$computer.Name}},@{n='ServersAndBases';e={$DBsAndServers}}
                    } # End If
                } # End foreach
            }catch {
                Write-Host "Copy-Item failed for $user on a $computer with error $_" -ForegroundColor Red
            }
        } else {
           write-host "Coputer $computer not pingable"
        }
    } # End foreach
    Если нужны только тестовые базы то
    $DBsAndServers += '' | select @{n = 'ServerName';e={$Matches['ServerName']}},@{n = 'BaseName';e={$Matches['BaseName']}} | Where {$_.BaseName -like "*test*"}
    


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • Почти то что надо, вот если не по маске *test* а не включая все рабочие базы, то есть вывести все базы кроме конкретных баз с именами (BuhSp,Kazna,ogo,prodtest). 

    и вывести все это в отдельный файл. Получается что в файл при использовании copy-item выводятся опять же все базы.


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!



    • Изменено rеstless 7 мая 2020 г. 11:00
  • Почти то что надо, вот если не по маске *test* а не включая все рабочие базы, то есть вывести все базы кроме конкретных баз с именами (BuhSp,Kazna,ogo,prodtest). 

    и вывести все это в отдельный файл. Получается что в файл при использовании copy-item выводятся опять же все базы.


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    $DBsAndServers += '' | select @{n = 'ServerName';e={$Matches['ServerName']}},@{n = 'BaseName';e={$Matches['BaseName']}} | Where {$_.BaseName -NotIn @('BuhSp','Kazna','ogo','ProdTest')}

    Это не отдельная команда а кусок конструктора

    Такую структуру проще всего вывести в XML через Export-Clixml

    в последнем примере нет copy-item

    Чтоб запихнуть результат в переменную поменяйте строку с первым форичем 

    $ScriptOutput = foreach ($computer in $computers){

    после чего можно $ScriptOutput | Export-CliXML c:\tmp\1cdbs.xml


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Содержимое файла Xml конечно очень насыщенное. А возможно данный формат Xml как то приводить в читабельное состояние, или фильтровать по нужным строкам ? 

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • Содержимое файла Xml конечно очень насыщенное. А возможно данный формат Xml как то приводить в читабельное состояние, или фильтровать по нужным строкам ? 

    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

    вы ж видите что все возможно но часто упирается в тз

    покажите как выглядит (на скрине с замазанными данными которые не стоит светить) ваш результат чтоб понимать где мы сейчас находимся

    часть кода я пишу с телефона а часть не имея ни клиентов, ни ад ни 1с но с пк


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Если делать вывод через Out-Host в формате txt, то получается так

    UserName                                             ComputerName              ServersAndBases                                     
    --------                                             ------------                                         ---------------                                     
    user1                                            DESK-02                                                                                                  
    user1                                            DESK-03                      {@{ServerName=sd-ap02; BaseName=docflow}, @{Serve...

    Как видно что вывод ServersAndBases  не очень читабелен

    Если выводить через Export-Csv, то имен баз вообще нет

    #TYPE Selected.System.String
    "UserName","ComputerName","ServersAndBases"
    "user1","DESK-02",""
    "user1","DESK-03","     "

    Если выводить в формате Xml , то получается следующее (в конце самого Xml):

    

    И выше еще груда кода.

    Хотелось бы получить более читабельную таблицу: хост, юзер и все его  базы кроме..если есть. и такое по всем доступным хостам и юзерам


    Люди тратят здоровье, что бы заработать $, а затем тратят $, что бы вернуть здоровье!

  • $computers = Get-ADComputer -Filter * -SearchBase "OU=client computers,DC=domain,DC=com"
    $ErrorActionPreffence = 'Stop'
    $ScriptOutput = foreach ($computer in $computers){
       if (Test-Connection $computer.Name){
            try {
                $BasicPath = "\\$($Computer.name)\C`$\Users\"
                Get-ChildItem "$BasicPath" -Directory | Foreach {
                    $User = $_
                    $OneCConfigPath = "$BasicPath\$User\AppData\Roaming\1C\1CEStart\ibases.v8i"
                    if (Test-Path $OneCConfigPath){
                        Get-Content $OneCConfigPath | Foreach {
                            if ($_ -match 'Connect=Srvr="(?''ServerName''[^"]+)";Ref="(?''BaseName''[^"]+)"'){
                                '' | select @{n='UserName';e={$User}}, `
                                            @{n='ComputerName';e={$computer.Name}}, `
                                            @{n = 'ServerName';e={$Matches['ServerName']}}, `
                                            @{n = 'BaseName';e={$Matches['BaseName']}} | Where {$_.BaseName -notin @('BuhSp','Kazna','ogo','ProdTest')}
                            } # End If
                        }
                    } else {
                        Write-Host "[$($computer.name)] Not found 1c config file for '$User' user" -ForegroundColor Yellow
                    }
                } # End foreach
            }catch {
                Write-Host "Something failed while getting info for $user on a $computer. Error $_" -ForegroundColor Red
            }
        } else {
           write-host "Computer '$computer' is not pingable" -ForegroundColor Yellow
        }
    } # End foreach
    
    # Групировка по пользователям
    $ScriptOutput | Group-Object UserName
    # Групировка по ПК
    $ScriptOutput | Group-Object ComputerName
    # Получение уникальных названий баз
    $ScriptOutput.BaseName | Select -Unique
    # Сохранение всего в пр=лоском формате 
    $ScriptOutput | Export-Csv C:\TMP\1cDatabases.csv -Delimiter ';'
    # Вывод в читаемом формате с возможностью поиска и фильтрации
    $ScriptOutput | Out-GridView



    The opinion expressed by me is not an official position of Microsoft

    • Предложено в качестве ответа Vector BCOModerator 11 мая 2020 г. 19:05
    • Помечено в качестве ответа Vector BCOModerator 13 мая 2020 г. 2:48
    Модератор
  • Добрый день! Как ваши успехи?


    The opinion expressed by me is not an official position of Microsoft

    Модератор