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

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

15.10.2024, 17:21. Показов 1780. Ответов 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,663
Записей в блоге: 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
5961 / 4537 / 1094
Регистрация: 29.08.2013
Сообщений: 28,148
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru