2016-06-14 16 views
0

Ich habe ein Anmeldeskript erstellt, das jeden Benutzer, der in den letzten X Tagen auf dem Computer war, für die Gruppe Administratoren aufruft. Ich habe dieses Skript erfolgreich getestet und habe in keinem meiner Tests Probleme mit der Ausführung. Ich habe ein Gruppenrichtlinienobjekt erstellt, das dieses Skript mit einer bestimmten Organisationseinheit in meiner Organisation verknüpft, und ich finde, dass eine Fehlerrate von 25% ordnungsgemäß ausgeführt wird.Anmeldeskript bewirkt, dass powershell.exe in einer Schleife gestartet und geschlossen wird

Der "Fehler" ist der schwierige Teil, weil 1) es nur für eine relativ kleine Anzahl von Benutzern auftritt, und aus diesem Grund 2) verstehe ich nicht, was konzeptionell passiert. Insbesondere wird der Benutzer angemeldet, und PowerShell.exe wird sofort gestartet und geschlossen. Dies wird jedoch auf unbestimmte Zeit fortgesetzt, bis Sie Powershell beenden erzwingen. Das Fenster wird auf den Desktop ausgerichtet und verhindert, dass Benutzer arbeiten.

Wenn ich Computerverwaltung verwenden, um die Administratorgruppenmitgliedschaft auf dem Computer remote anzuzeigen, kann ich sehen, dass das Skript erfolgreich ausgeführt wurde (es fördert die Benutzer zu Admins), aber ich bin nicht sicher, was verursacht es neu zu erstellen und nur für einige Benutzer.

Ich kann das Skript posten, wenn es hilft (kurz), aber da es die meiste Zeit "arbeitet", würde ich geneigt sein, anzunehmen, dass eine Komponente von PowerShell auf diesen Maschinen fehlgeschlagen oder fehlgeschlagen ist. Ich hoffe, dass diese Art von Verhalten bekannt ist oder von jemandem in der Gemeinschaft erlebt wurde. Der letzte Punkt, den ich hinzufügen werde, ist, dass in 2 Fällen nur der Neustart des Benutzers es behoben hat.

Script-Code:

# 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 
+0

Bitte schreiben Sie das Skript selbst, möglicherweise etwas, das unter bestimmten Bedingungen anfällig für Fehler ist –

+0

Ok, ich habe den ursprünglichen Beitrag aktualisiert. –

Antwort

0

Ich dachte, dies aus mir - der einzige strittige Teil war die .net Sachen am Anfang so habe ich versucht, diesen Teil auszukommen:

# 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 
} 

und dass gearbeitet ... Ich nehme an, es waren .NET-Probleme auf den Rechnern, die das nicht richtig ausgeführt haben, danke, dass Sie sich das angesehen haben.