dersud
Goto Top

VBS Code funkt, aber ASP-Variante nicht

Hallo zusammen!

Da ich nicht der Programmierer bin, habe ich mir folgenden VBS-Code aus dem Internet zusammengeschustert, der als Paramter einen Workstationnamen entgegennimmt und ein darauf befindliches Profil (welches sich am besagten Namen orientiert) sowohl aus Registry, als auch aus C:\Users löscht. Das Skript läuft mit den hardgecodeten Service-Credentials von der Shell (cmd mit cscript.exe), aber sobald ich daraus ein Classic.ASP-Skript (IIS auf Windows Server 2019) mache, erhalte ich immer Error 424 Objekt erforderlich beim objUserProfile.Delete_. Ich habe schon unzählige Tipps gegoogelt, aber keiner fruchtet, so dass ich es nicht schaffe, das Skript mittels URL-Aufruf (z.B. mit http://localhost/delete_profile.asp?rechnerName=RD401) auszuführen.

Hier der besagte VBS-Code:
Option Explicit

'Now the variables
Dim LOGON_USER, AUTH_USER, REMOTE_ADDR, DOMAIN_NAME, MGMT_USER, MGMT_PWD, ARG
Dim rechnerName, UserProfileName, QueryPath, objSID, objUserProfile, returnValue
Dim objSWbemLocator, objSWbemServices, colProfiles, objProfile, colItems, objItem
Dim Folder()

DOMAIN_NAME = "DOMAINNAME"
MGMT_USER = "DOMAINNAME\SUPAUSER"
MGMT_PWD = "KENNWORT0815"
returnValue = 0

'------------ only in vbs --------------------
Set ARG = Wscript.Arguments
if (ARG.Count = 0) then
WScript.Echo "Usage: delete_profile.vbs {Name of PC}"
Wscript.Quit 1
else
rechnerName = ARG(0)
end if
'----------------------------------------------------

On Error Resume Next
Err.Clear
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(rechnerName, "root\cimv2", MGMT_USER, MGMT_PWD)

If Err.Number <> 0 Then
Set objSWbemServices = Nothing
Wscript.Echo "fail"
Response.End
End If

objSWbemServices.Security_.ImpersonationLevel = 3

'extracting profilename from hostname (x123 or xx123 -> u123)
UserProfileName = "u" & Right(rechnerName,3)

Set colProfiles = objSWbemServices.ExecQuery("SELECT * FROM Win32_UserProfile")
For Each objProfile in colProfiles
Set objSID = objSWbemServices.Get("Win32_SID.SID='" & objProfile.SID &"'")
If (objSID.ReferencedDomainName = DOMAIN_NAME) Then
If (objSID.AccountName = UserProfileName) Then
Err.Clear
Set objUserProfile = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & rechnerName &"\root\cimv2:Win32_UserProfile." & "SID='" & objProfile.Sid &"'")
objUserProfile.Delete_
If Err.Number = -2147024809 Then
Wscript.Echo "Fail: Profile in use, skipping"
returnValue = 1
ElseIf Err.Number <> 0 Then
Wscript.Echo "Error: " & Err.Number & ": " & Err.Description
returnValue = Err.Number
Else
Wscript.Echo "ok"
End If
End If
End If
Next


Set objSID = Nothing
Set colProfiles = Nothing
Set objSWbemServices = Nothing

WScript.Quit(returnValue)

Zur Info: beim ASP-Skript wird der recherName mittels Request.Querystring("rechnerName") geholt und statt Wscript.echo steht ein Response.Write an den notwendigen Stellen.
Vielleicht weiß jemand noch einen Rat?

greets

Content-Key: 549721

Url: https://administrator.de/contentid/549721

Ausgedruckt am: 29.03.2024 um 05:03 Uhr

Mitglied: TRDSRLZ
TRDSRLZ 20.02.2020 aktualisiert um 18:35:05 Uhr
Goto Top
So Moment. Du willst ein Serverseitiges VBSkript ausführen? Oder ist das Clientseitig?
Mitglied: TRDSRLZ
TRDSRLZ 20.02.2020 um 18:41:48 Uhr
Goto Top
Ok Serverseitig wenn ich richtig verstehe.

Du übergibst vom Client den Parameter 'Rechnername' und führst dann dein Skript auf einem Server aus. Dort soll mit dem Userobjekt interagiert werden das auf dem Client liegt?

Wenn du das Parameter übergibst, wird das Skript ja immer noch am Server ausgeführt.... du willst aber ja wohl dass es eine Aktion am Client durchführt oder?
Mitglied: sabines
sabines 21.02.2020 um 07:09:31 Uhr
Goto Top
Moin,

wenn es Dir nur um das Löschen von Profilen geht, dann kannst Du das hier kostenfrei per Startup Script laufen lassen:
https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

Oder Du erfindest das Rad neu face-wink

Gruss
Mitglied: DerSud
DerSud 21.02.2020 um 15:02:47 Uhr
Goto Top
Das Skript wird am Server ausgeführt, dieser verbindet sich in Folge zum Client und löscht dort das Profil. Das ist dem Umstand geschuldet, dass sich auf Grund der Security nur Server zu den Clients verbinden dürfen. Leider muss das Profil-Löschen nicht nur der Administrator dürfen, sondern auch beliebige andere User. Darum der IIS, wo eine Verwaltungswebseite mit einem Button "Profil löschen" existiert. Hoffe ich habe das jetzt genauer beschrieben face-smile
Mitglied: DerSud
DerSud 21.02.2020 um 15:05:44 Uhr
Goto Top
@ sabines: wäre schön, aber delprof2 funktioniert schon lange nicht mehr mit Windows 10 (siehe dein Link). Aber das neue Rad will eben nicht so...
Mitglied: DerSud
DerSud 03.03.2020 um 16:32:57 Uhr
Goto Top
Nach knapp zwei Wochen herumprobieren (als Nicht-Programmierer wohlgemerkt) bin ich endlich auf die Lösung gestoßen, die ich zwecks Doku für mich und für alle anderen, die auf diesen Thread stoßen, hier in einfacher Form angebe:

Der Fehler 424 ist leider mehrdeutig. In meinem Fall war die Aussage aber ziemlich korrekt, nur bin ich vorerst nicht auf die Ursache gestoßen. Und die war, dass ich mit Set objUserProfile = GetObject("winmgmts.... ein neues Objekt erstellt habe. Das hat zwar in der Shell noch gefunkt, aber über den IIS nicht mehr, da dies eine doppelte WMI-Verbindung wäre, die so nicht erlaubt ist. (Die letzten Windows-Updates haben dann den gleichen Fehler auf der Shell geworfen, was mich auf die Spur gebracht hat).

Korrekterweise muss man daher die erste Verbindung (die mit Set objSWbemServices = objSWbemLocator.ConnectServer aufgebaut wird) weiter nutzen und zwar mit diesen korrigierten Zeilen, die statt der fetten oberhalb zur Anwendung kommen:
Set colUserProfiles = objSWbemServices.ExecQuery("Select * From Win32_UserProfile Where SID='" & objProfile.Sid & "'")
For each objUserProfile in colUserProfiles
Wscript.Echo "Local Path = " & objUserProfile.LocalPath
objUserProfile.Delete_
Next

(Danach gehts mir If Err.Number weiter)

Somit habe ich endlich ein funktionstüchtiges Skript für den Enduser zum Löschen von Profilen auf Remotemaschinen, die auch unter Windows 10 laufen können.

So long and thanks for all the fish face-wink