Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.10.2024
Сообщений: 2

Актуализация реестра АРМ

15.10.2024, 17:21. Показов 1861. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Была поставлена задача актуализировать-автоматизировать список АРМ в домене. На данный момент реализовал логон скрипт, который при опросе сопоставляет имя пк с именем залогиненого юзера и записывает в csv. Важный момент, при повторных выполнениях регламентного задания, имена уже успешно обработаных PC пропускаются и обрабатываются только неидентифицированные PC.
Но при сценарии, когда сотрудник сдал компьютер и получил новый старая запись остается. Больше того, так, как он уже считается идентифицированным и скрипт его не трогает, то в случае выдачи этого PC другому сотруднику - в базу он не попадет.
Помогите пожалуйста, буду крайне благодарен.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# Путь к существующему отчету (если файл существует)
$outputPath = "C:\ProgramData\domain_scripts_result\outputComputersOwners.csv"
 
# Проверяем, существует ли файл с предыдущими данными
if (Test-Path $outputPath) {
    # Загружаем предыдущие данные
    $existingData = Import-Csv $outputPath
} else {
    Write-Host "Файл с данными не найден. Завершение работы скрипта."
    exit
}
 
# Получаем список всех компьютеров в домене
$computers = Get-ADComputer -Filter * -Property Name
 
# Создаем массив для хранения новых результатов
$result = @()
 
foreach ($computer in $computers) {
    # Проверяем, есть ли данные о пользователе для этого компьютера
    $existingRecord = $existingData | Where-Object { $_.ComputerName -eq $computer.Name }
 
    if ($existingRecord) {
        # Если компьютер уже обработан и статус корректен, пропускаем
        if ($existingRecord.LastLoggedOnUser -ne "No user logged in or unavailable" -and $existingRecord.LastLoggedOnUser -ne "Failed to retrieve user") {
            $result += $existingRecord
            Write-Host "Компьютер $($computer.Name) уже обработан, данные не будут изменены."
            continue
        }
    }
 
    # Попытка получить информацию о последнем пользователе через WMI только для неидентифицированных компьютеров
    try {
        if (Test-Connection -ComputerName $computer.Name -Count 1 -Quiet) {
            $lastUser = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computer.Name -ErrorAction Stop | Select-Object -ExpandProperty UserName
            if ($lastUser -match "KFT") {
                # Если пользователь найден, обновляем данные
                $result += [pscustomobject]@{
                    ComputerName     = $computer.Name
                    LastLoggedOnUser = $lastUser
                }
                Write-Host "Обновлена информация для $($computer.Name): $lastUser"
            } else {
                # Если пользователь не найден, обновляем статус
                $result += [pscustomobject]@{
                    ComputerName     = $computer.Name
                    LastLoggedOnUser = "No user logged in or unavailable"
                }
                Write-Host "Пользователь на компьютере $($computer.Name) не найден."
            }
        } else {
            Write-Host "Компьютер $($computer.Name) недоступен по сети."
            $result += [pscustomobject]@{
                ComputerName     = $computer.Name
                LastLoggedOnUser = "Failed to retrieve user"
            }
        }
    } catch {
        # Если произошла ошибка, записываем статус
        Write-Host "Ошибка при получении информации с $($computer.Name): $_"
        $result += [pscustomobject]@{
            ComputerName     = $computer.Name
            LastLoggedOnUser = "Failed to retrieve user"
        }
    }
}
 
# Сохраняем обновленные данные в CSV-файл
$result | Export-Csv -Path $outputPath -NoTypeInformation
 
Write-Host "Отчет обновлен и сохранен по пути: $outputPath"
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.10.2024, 17:21
Ответы с готовыми решениями:

Актуализация данных
Есть общая таблица-свод всех данных для статистики по городам. Она связана с книгой 1 и книгой 2 по полю "город"-он не меняется. ...

Актуализация точки ввода в TextBox
Используется TextBox, в который записывается всё, что делает программа. Количество строк достигает тысяч. Запись ведется блоками по 5-18...

Актуализация данных в ячейках в диапазоне заданных дат
Здравствуйте, прошу помощи! В приложенном файле, в столбцах "NO" и "NP" у меня есть ячейки для дат, начало и конец отпуска...

4
 Аватар для alhaos
1929 / 545 / 154
Регистрация: 20.02.2019
Сообщений: 2,664
Записей в блоге: 65
16.10.2024, 06:33
commitdaniil, Какой прилежный код!, комментарии, внятные переменные, отступы, приятно читать, с кодом у вас все в порядке.

С логикой вот не очень, Вам нужно определиться, что нужно делать если появляется компьютер имя которого совпадает с существующей записью, а имя пользователя нет, как вы будете определять что это новый сотрудник, а не левый логон на этом же компьютере.

Я не сисадмин, и с контроллерами домена имел дело опосредованно, но думаю на контроллере есть информация о том кто, откуда и когда логонился. Я считаю, что лучше сделать анализатор этой информации. И опять же думаю, что задача которую вы поставили не перед вами первым возникла, и наверняка есть более типичные решения.
0
0 / 0 / 0
Регистрация: 15.10.2024
Сообщений: 2
18.10.2024, 08:59  [ТС]
да, понимаю что есть ПО, которое может предоставить необходимый функционал, но в основном оно платное и идет в комплексе с инвентаризацией для всего предприятия, то есть очень много избыточных функций. Хотелось бы доработать текущий скрипт, кажется что решение где-то рядом, но не доходит до меня)) еще не опытен в данном моменте.
0
0 / 0 / 0
Регистрация: 06.06.2024
Сообщений: 3
17.03.2025, 10:45
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Путь к существующему отчету (если файл существует)
$outputPath = "C:\ProgramData\domain_scripts_result\outputComputersOwners.csv"
 
# Проверяем, существует ли файл с предыдущими данными
if (Test-Path $outputPath) {
    # Загружаем предыдущие данные
    $existingData = Import-Csv $outputPath
} else {
    Write-Host "Файл с данными не найден. Завершение работы скрипта."
    exit
}
 
# Получаем список всех компьютеров в домене
$computers = Get-ADComputer -Filter * -Property Name
 
# Создаем массив для хранения новых результатов
$result = @()
 
# Текущая дата и время
$currentDate = Get-Date
 
foreach ($computer in $computers) {
    # Проверяем, есть ли данные о пользователе для этого компьютера
    $existingRecord = $existingData | Where-Object { $_.ComputerName -eq $computer.Name }
 
    # Если запись существует и была обновлена менее недели назад, пропускаем
    if ($existingRecord -and ($currentDate - [datetime]$existingRecord.LastUpdated).TotalDays -lt 7) {
        $result += $existingRecord
        Write-Host "Компьютер $($computer.Name) уже обработан, данные не будут изменены."
        continue
    }
 
    # Попытка получить информацию о последнем пользователе через WMI
    try {
        if (Test-Connection -ComputerName $computer.Name -Count 1 -Quiet) {
            $lastUser = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $computer.Name -ErrorAction Stop | Select-Object -ExpandProperty UserName
            if ($lastUser -match "KFT") {
                # Если пользователь найден, обновляем данные
                $result += [pscustomobject]@{
                    ComputerName     = $computer.Name
                    LastLoggedOnUser = $lastUser
                    LastUpdated      = $currentDate
                }
                Write-Host "Обновлена информация для $($computer.Name): $lastUser"
            } else {
                # Если пользователь не найден, обновляем статус
                $result += [pscustomobject]@{
                    ComputerName     = $computer.Name
                    LastLoggedOnUser = "No user logged in or unavailable"
                    LastUpdated      = $currentDate
                }
                Write-Host "Пользователь на компьютере $($computer.Name) не найден."
            }
        } else {
            Write-Host "Компьютер $($computer.Name) недоступен по сети."
            $result += [pscustomobject]@{
                ComputerName     = $computer.Name
                LastLoggedOnUser = "Failed to retrieve user"
                LastUpdated      = $currentDate
            }
        }
    } catch {
        # Если произошла ошибка, записываем статус
        Write-Host "Ошибка при получении информации с $($computer.Name): $_"
        $result += [pscustomobject]@{
            ComputerName     = $computer.Name
            LastLoggedOnUser = "Failed to retrieve user"
            LastUpdated      = $currentDate
        }
    }
}
 
# Сохраняем обновленные данные в CSV-файл
$result | Export-Csv -Path $outputPath -NoTypeInformation
 
Write-Host "Отчет обновлен и сохранен по пути: $outputPath"


1) Добавлено поле LastUpdated, которое хранит дату и время последнего обновления записи. Это позволяет скрипту перепроверять компьютеры, которые не обновлялись в течение определенного времени (в данном случае — недели).
2)Если запись существует и была обновлена менее недели назад, скрипт пропускает этот компьютер. В противном случае, он выполняет проверку и обновляет данные.
3)Если запись устарела (например, прошло больше недели с момента последнего обновления), скрипт перепроверяет компьютер и обновляет данные.
0
5984 / 4559 / 1095
Регистрация: 29.08.2013
Сообщений: 28,197
Записей в блоге: 3
17.03.2025, 11:10
зачем вообще это вот все?
поднимите на 1 компе бесплатный MSSQL, создайте табличку и пишите в нее кто и с какого компа заходил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2025, 11:10
Помогаю со студенческими работами здесь

Обновление datagridview - актуализация с источником данных в реальном времени
Много пересмотрел в интернете и тем на этом форуме,но так и не разобрался. В приложении есть datagridview который отображает данные из...

Актуализация данных на странице для всех пользователей в момент добавления информации
Добрый день. ребята, помогите разобраться начинающему программисту. На странице создан текстбокс и кнопочка с событием, которое...

Как предотвратить windows xp от потери реестра? или поломки реестра...
Хочу узнать как предотвратить windows xp от потери реестра. Ато уже как то надоело раз в месяц восстанавливать его..

Указаный файл не является файлом данных реестра, возможен импорт только двоичных файлов данных реестра
помогите пожалуйста , при загруске файла в системный реестр у меня выбивает ошибку , я не могу понять в чем дело . Вот образец ...

Редактирование реестра (файл реестра)
Есть файл реестра, скажем C:\\file.reg. Нужно из программы на C++ отредактировать реестр с помощью этого файла, но так, чтобы при этом не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru