Я создал сценарий входа в систему, который продвигает любого пользователя, работавшего на машине за последние X дней, в группу администраторов. Я успешно протестировал этот скрипт, и у меня не было проблем с выполнением ни в одном из моих тестов. Я создал объект групповой политики, который связывает этот сценарий с определенным подразделением в моей организации, и я обнаружил, что частота сбоев составляет около 25% для правильного выполнения.
«Сбой» - это неприятная часть, потому что 1) это происходит только для относительно небольшого числа пользователей, и из-за этого 2) я не понимаю, что происходит концептуально. В частности, пользователь входит в систему, а затем PowerShell.exe запускается и немедленно закрывается, но затем продолжает делать это бесконечно, пока вы принудительно не выйдете из powershell — окно фокусируется на рабочем столе и не позволяет пользователям работать.
Когда я использую Управление компьютером для удаленного просмотра членства в группе администраторов на компьютере, я вижу, что сценарий успешно выполнен (он повышает пользователей до администраторов), но я не уверен, что вызывает его повторное появление, и только для некоторых пользователей.
Я могу опубликовать сценарий, если он поможет (он короткий), но поскольку большую часть времени он «работает», я склонен предположить, что какой-то компонент PowerShell не работает или не работает на этих машинах. Я надеюсь, что такое поведение известно или сталкивалось с кем-то в сообществе раньше. Последнее, что я добавлю, это то, что в 2 случаях это исправила только перезагрузка пользователя.
Код скрипта:
# Launches elevated PS session if possible.
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
$Threshold = (Get-Date).AddDays(-30)
# Non-builtin regular user SIDs are always prefixed S-1-5-21-
$DomainUserFilter = "SID LIKE 'S-1-5-21-%'"
# Suppress Errors
$ErrorActionPreference = "SilentlyContinue"
# Retrieve user profiles
$DomainProfiles = Get-WmiObject -Class Win32_UserProfile -Filter $DomainUserFilter
foreach($UserProfile in $DomainProfiles)
{
# Check if profile was ever used, skip if not
if(-not $UserProfile.LastUseTime)
{
continue
}
# Convert the datetime string to a proper datetime object
$LastUsed = $UserProfile.ConvertToDateTime($UserProfile.LastUseTime)
# Compare against threshold
if($LastUsed -gt $Threshold)
{
# Resolve user profile SID to account name
$Account = (New-Object System.Security.Principal.SecurityIdentifier $UserProfile.SID).Translate([System.Security.Principal.NTAccount])
if($?)
{
# Add to Administrators group
net localgroup administrators $Account.Value /add
}
}
}
net localgroup administrators “domain users” /delete
exit