Аннотация
Итак, я работаю в компании, у которой около 10 000 компьютеров на моем домене. Моя проблема заключается в том, сколько времени требуется, чтобы запросить, существует ли пользователь на компьютере, чтобы узнать, входили ли они когда-либо на указанный компьютер. Нам нужна эта функциональность для аудитов, если они сделали что-то, чего не должны были делать.
У меня есть два метода, которые я исследовал для выполнения этой задачи, и третье альтернативное решение, о котором я не подумал;
-Метод A: запрос на каждый компьютер C:\Users‹USER›, чтобы узнать, существует ли LocalPath.
-Метод B: проверка реестра каждого компьютера на наличие HKU:‹SID›, чтобы узнать, существует ли SID.
-Метод С: Вы все умнее меня и есть способ лучше? XD
Метод Функция
$AllCompFound = @()
$AllADComputer = Get-ADComputer -Properties Name -SearchBase "WhatsItToYa" -filter 'Name -like "*"' | Select-Object Name
ForEach($Computer in $AllADComputers) {
$CName = $Computer.Name
if (Get-CimInstance -ComputerName "$CName" -ClassName Win32_Profile | ? {"C:\Users\'$EDIPI'" -contains $_.LocalPath}) {
$AllCompFound += $CName
} else {
#DOOTHERSTUFF
}
}
ПРИМЕЧАНИЕ. У меня есть еще одна функция, которая предлагает мне ввести имя пользователя для проверки. Там, где я работаю, это числа, поэтому чувствительность к регистру не является проблемой. Моя проблема с этой функцией заключается в том, что я считаю, что оператор if возвращает true каждый раз, потому что он запускается, а не потому, что он соответствует имени пользователя.
Функция метода Б
$AllCompFound = @()
$AllADComputer = Get-ADComputer -Properties Name -SearchBase "WhatsItToYa" -filter 'Name -like "*"' | Select-Object Name
$hive = [Microsoft:Win32.RegistryHive]::Users
ForEach($Computer in $AllADComputers) {
try {
$base = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($hive, $Computer.Name)
$key = &base.OpenSubKey($strSID)
if ($!key) {
#DOSTUFF
} else {
$AllCompFound += $Computer.Name
#DOOTHERSTUFF
}
} catch {
#IDONTTHROWBECAUSEIWANTITTOCONTINUE
} finally {
if($key) {
$key.Close()
}
if ($base) {
$base.Close()
}
}
}
ПРИМЕЧАНИЕ. Перед этой функцией у меня есть другая функция, которая преобразует имя пользователя в SID. Оно работает.
Где мои глаза начинают стекленеть, так это использовать Invoke-Command и фактически возвращать значение обратно, а также следует ли запускать все эти запросы как их собственный PS-Session или нет. Мой метод A возвращает ложные срабатывания, а мой метод B зависает на некоторых компьютерах.
Ни один из этих методов не достаточно быстр, чтобы получить результаты 10 000, я использовал меньшие пулы компьютеров, чтобы проверить эти результаты по запросу. Я ни в коем случае не эксперт, но я думаю, что хорошо понимаю, поэтому любая помощь приветствуется!