Avatar billede oskar Nybegynder
07. september 2003 - 22:43 Der er 18 kommentarer og
1 løsning

Slet brugere ikke på liste

Jeg opretter brugere ud fra en liste i en tekstfil. Når en bruger ikke mere eksisterer slettes vedkommende fra listen. Jeg har ikke indflydelse på indholdet i listen, så den kan jeg ikke lave om på.

Jeg gerne have scriptet til at slette brugere i AD'et, som ikke er på listen.

Jeg indlæser fra listen via en løkke til et Array og alle brugere fra AD'et via et filter. Men jeg kan ikke få de to til at arbejde sammen.

Fra AD:
Set oCN = GetObject("LDAP://OU=Afdeling1,OU=Brugere,DC=xxxx,DC=dk")
oCN.Filter = Array("User")

Fra tekstfil:
While Not tsinputfile.AtEndOfStream                strLine = tsinputfile.ReadLine
    arrInput = Split(strLine, ",")
    arrInput(0)=replace(arrInput(0),chr(34),"")   
osv...
Wend

Hvis jeg lægger den ene ind i den anden og forsøger at læse (echo) indholdet sker der ikke noget som helst.

:) Oskar
Avatar billede nmh Nybegynder
07. september 2003 - 22:53 #1
Vil du ikke være rar at uddybe, hvad du mener med dette

"Hvis jeg lægger den ene ind i den anden og forsøger at læse (echo) indholdet ........"
Avatar billede nmh Nybegynder
07. september 2003 - 22:56 #2
Er dit problem at få sammenlignet de to lister, så du kan få lavet en liste af brugere, der skal slettes?

Eller er dit problem LDAP-tingene?
Avatar billede oskar Nybegynder
07. september 2003 - 23:00 #3
Jo gerne. Jeg kører f.eks. en løkke de læser alle navne i en bestemt OU. For hver eneste fundne bruger kører jeg så en løkke der læser indholdet i tekstfilen. Hvis brugeren i AD findes i løkken skal der ikke ske noget, hvis brugeren ikke findes på listen skal han slettes.

det var ideen, men det virker bare ikke.
Avatar billede oskar Nybegynder
07. september 2003 - 23:02 #4
Mit problem er at finde en løsning der virker. Om det er at lave en liste eller løse løkkeproblemet er et fedt.
Avatar billede nmh Nybegynder
07. september 2003 - 23:09 #5
Nej, det er vel ikke et fedt. Først må du lige finde ud af, om du faktisk får fundet de brugere, der ikke er på listen.
Prøv at udskrive en tekstfil over de brugere.
Når det så virker, kan du tage fat på atfå slettet disse brugere ved passende brug af LDAP .
Avatar billede oskar Nybegynder
07. september 2003 - 23:12 #6
Det er netop det der er problemet: Jeg finder alle brugere i AD'et og jeg finder alle brugere i tekstfilen. Jeg mangler at finde de brugere der ikke er på listen.
Avatar billede nmh Nybegynder
07. september 2003 - 23:18 #7
Men dvs, at problemet er et problem, der alene handler om at lave en liste over brugere, der ikke er på begge lister.'
Hvor store lister taler vi om?
Hvilket format anvendes i de to lister?
Får du en liste over brugere i form af brugernavne, eller er brugernavnene ikke helt det samme som navnene på listen, du ikke selv har indflydelse på?
Avatar billede oskar Nybegynder
07. september 2003 - 23:27 #8
Listen er voksende, lige nu ca 1400 brugere.
txt-fil a,la "Nr","Type","Brugernavn","cpr","fornavn","Efternavn"
Brugernavn er det samme på listen som i AD
Avatar billede nmh Nybegynder
07. september 2003 - 23:37 #9
Dvs listerne er ikke større, end at de kan være i serverens RAM-lager, mens de behandles, men det vil nok være en god ide at lave to sorterede brugernavns-lister, når du skal sammenligne listerne. Kunne der være problemer med store og små bogstaver, så du skal omdanne til f.eks. store, med Ucase-funktionen.

Har jeg forstået dig ret, at du ikke har nogle problemer med at få slettet en bruger, hvis navn du kender, med et passende LDAP-script?
Avatar billede nmh Nybegynder
07. september 2003 - 23:48 #10
Jeg lukker ned nu, men vender tilbage i morgen, når du har svaret på min sidste kommentar.
Avatar billede squashguy Nybegynder
08. september 2003 - 00:19 #11
f.eks. noget i denne stil, du indlæser alle brugernavne i et array:

okusers = Array("bruger 1", "bruger 2", ...)

For Each User In oCN
  For i=0 to UBound(okusers)
    If okusers(i) = LCase(Mid(User.Name, 4)) Then Exit For
  Next

  If i = UBound(okusers)+1 Then
    'bruger blev ikke fundet, slet ham
  End If
Next
Avatar billede nmh Nybegynder
08. september 2003 - 15:53 #12
Hvis du har 1400 brugere vil squashguys script nok køre for langsomt. Og det du selv har lavet har måske samme problem.
(tænk på den situation, at kun 1 bruger skal slettes, og denne bruger er til sidst i listen oCN. Der bliver vist tale om en mindst 1 million sammenligninger af navne).

Du bør først sortere de to lister enten ved at bruge quick-sort elle comb-sort.
Hvis listen over brugere er gemt i A(0),A(1),...,A(n)
,den reviderede evt. mindre liste er gemt i B(0), B(1),...,B(m), begge lister er sorterede så A(0)<A(1)<... og
B(0)<B(1)<...
vil et script der piller de A-elementer ud, der ikke er i B-listen kunne se således ud:

p=0
for i=0 to n
  if A(i)<>B(p) then
    slet brugeren A(i)
  else
    if p<m then p=p+1
  end if
next
Avatar billede oskar Nybegynder
08. september 2003 - 23:03 #13
-> nmh Der er ikke problemer med Upper/lower i udtrækkene. Og jeg har ingen problemer med at slette brugere og alle deres filer, profilmapper mm. i et hug.

Squashguy forslag ligner vist det jeg havde forstillet mig, men mnh har vist ret i at det bliver en meget lang proces, så jeg må hellere kigge lidt på sorteringsmekanismen.  Desværre er der akutte probs på arbejde lige nu så jeg får ikke meget tid i morgen heller til at kigge på det.
Avatar billede nmh Nybegynder
09. september 2003 - 10:37 #14
Nu har jeg lavet et script, der på grundlag af to usorterede lister af eksisterende brugere og en opdateret liste af brugere laver en liste over de brugere, der ikke er med mere, og en liste over nytilkomne brugere.

Listerne skal være på formen "navn1,navn2,...".
De nye lister vil er på samme form, men der bliver samtidigt lavet to arrays.

Scriptet kan afprøves som et VBscript, og til det formål udskrives de fire lister til sidst.

Sorteringsmetoden er CombSort, som desværre ikke kendes af så mange. Den er næsten lige så hurtig som QuickSort, men er langt simplere i sin opbygning.

jeg har længe selv haft behovet for et sådant script, så dette var anledningen til at få det lavet.
Avatar billede nmh Nybegynder
09. september 2003 - 10:41 #15
dim Users, U, okUsers, okU
dim Slettes, Slt(), Nyebrugere, Nye()
dim i, p, q, r, s, n, m, txt

sub Sort(A)
'Denne procedure sorterer arrayet, som
'overføres ved reference.
'Det er metoden CombSort, der benyttes.
'Den er næsten lige så hurtig som QuickSort
  dim n, gap,OK,i,j,tmp
'tabellen A sorteres. CombSort
  n=Ubound(A)
  gap = n
  ok = True
  While ok
    If gap < 1 Then gap = 1
    ok = (gap <> 1)
    For i = 0 To n - gap
      j = i + gap
      If A(i) > A(j) Then
        tmp = A(j): A(j) = A(i): A(i) = tmp
        ok=true
      End If
    Next
    gap = Int(gap / 1.33) 'Tallet 1.33 er bedst
  Wend
end sub

'Listen Users er brugerne der er i systemet.
'Listen okUsers er den nye brugerliste.
'Der skal laves en liste Slettes over de navne i Users, der ikke
'er i okUsers og en liste NyeBrugere over de nytilkomne.
'Krav: begge lister Users og okUsers indeholder mindst et element.

Users=  "D,C,B,A"
okUsers="C,G,B,E,F"
U=split(Users,",")
okU=split(okUsers,",")

'Vi sorterer nu de to arrays
sort U
sort okU

'Nu flettes de to lister
n=Ubound(U): m=Ubound(okU)
p=0: q=0: r=-1: s=-1
redim slt(n): redim Nye(m)
while p<=n and q<=m
  if U(p)<okU(q) then
    r=r+1: slt(r)=U(p):p=p+1
  elseif U(p)>okU(q) then
    s=s+1: Nye(s)=okU(q):q=q+1
  else
    p=p+1: q=q+1
  end if
wend

for i=p to n
  r=r+1
  Slt(r)=U(i)
next


for i=q to m
  s=s+1
  Nye(s)=okU(i)
next

if r>=0 then
  redim preserve slt(r)
  Slettes=join(slt,",")
end if

if s>=0 then
  redim preserve Nye(s)
  NyeBrugere=join(Nye,",")
end if

'Testudskrift
Users=join(U,",")
okUsers=join(okU,",")
txt="Users: " & Users & VBCrLf
txt=txt & "okUsers: " & okUsers & VBCrLf
txt=txt & "Slettes: " & Slettes & VBCrLf
txt=txt & "Nye: " & NyeBrugere
MsgBox txt
Avatar billede nmh Nybegynder
15. september 2003 - 15:55 #16
Nå, hvordan går det med projektet?
Avatar billede oskar Nybegynder
16. september 2003 - 08:13 #17
Det går desværre lidt tung med projektet eller rettere med tiden. Jeg har lige nu 500 brugere der skal skifte fra Tasktimer til Outlook på mandag, så sletteprojektet er stillet lidt i bero, men det ser lige ud til at være det jeg skal bruge så jeg vender forhåbenlig snart tilbage.

:)
Avatar billede oskar Nybegynder
19. september 2003 - 16:12 #18
Så fik jeg endelig lidt arbejdsro! Chefer er nogen gange irriterende med alle deres akutte her og nu jobs.
1000 tak til nmh, det var lige det der skulle til. Nu virker det bare.
Avatar billede nmh Nybegynder
19. september 2003 - 16:48 #19
Det var godt du kunne bruge det.

Takker for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester