Avatar billede Slettet bruger
28. november 2004 - 17:04 Der er 28 kommentarer og
1 løsning

Avanceret KIX-script

Først vil jeg lige sige, at jeg ikke er klar over om jeg har oprettet i den rette kategori, da der ikke er en specifik kategori til KIX.

Jeg har downloaded KIX og brugt en hel del tid på forumet på KIX's hjemmeside men jeg kan ikke komme videre med mit problem.

Jeg har en gruppe oprettet for hver af mine printere:
PRN_<SERVERNAVN>_<PRINTERSHARENAVN>

Når brugeren logger på, vil jeg gerne lave en kontrol af, om brugeren har nogle printere installeret, uden at være medlem af gruppen.
Har vedkommende det, skal printeren slettes.

Jeg vil gerne lave en check af alle grupper, og for hver gruppe der starter med "PRN", skal den tilslutte printeren ud fra gruppens navn.
Den skal altså selv kunne tage <SERVERNAVN> og <PRINTERSHARENAVN> ud af gruppens navn, og tilslutte en printer.

Er der nogen, der enten har et script liggende, der kan ovenstående, vil lave et script til mig, eller bare hjælpe mig på vej, da jeg er fuldstændig blank.

Jeg kunne sagtens lave et script alá:
if user ingroup "PRN_PRINTSERVER_PRINTER1"
  addprinterconnection ... bla. bl.a

Men ideén er at jeg oprettet en gruppe, og tildeler brugeren denne gruppe, uden at skulle modificere scriptet.

Det burde være muligt.
Avatar billede lap Nybegynder
28. november 2004 - 17:19 #1
Dit script kan blive lidt tungt, men med winmgmt kan du liste alle grupper:

Sub PullAllGroups(strDomain)
    Dim Computer
    Dim Group 

    Set Computer = GetObject("WinNT://" & strDomain)
    Computer.Filter = Array("Group")
    For Each Group in Computer
      Response.Write Group.Name
    Next
End Sub

Så har du alle grupper - herefter er det et generisk check af gruppenavne lignende:

if left($gruppe,4) = "PRN_"
  $gruppearray=split($gruppe,"_")
  $Server=$gruppearray(1)
  $Printer=$gruppearray(2)
  addprinterconnection...
endif

Det var tilslutningen - det modsatte bliver et gennemløb af alle printere i registry (HKCU\Printers\DevModePerUser) - vend tilbage hvis det giver problemer.
Avatar billede lap Nybegynder
28. november 2004 - 17:22 #2
ups - PullAllGroups var i vbscript udgave - samme i kix:

$NTgroups = getobject("WinNT://"+$NTDOMAIN)
dim $filter[0]
$filter[0]="Group"
$NTgroups.filter = $filter

for each $Group in $NTgroups
  ? $Group
next
Avatar billede Slettet bruger
29. november 2004 - 16:07 #3
Jeg får en fejl på linjen:
$NTgroups.filter = $filter

Error in expression: this type of array not supported in expressions.!
Avatar billede lap Nybegynder
29. november 2004 - 16:40 #4
Jeg har faktisk skrevet endnu et indlæg i denne tråd, som åbenbart er forsvundet. Ovenstående gennemløber alle grupper i domænet - du kunne også gennemløbe de grupper, som brugeren er medlem af med:

$Index = 0
DO
  $Group = ENUMGROUP($Index)
  $Index=$Index+1
UNTIL Len($Group) = 0

Jeg vender tilbage med lidt mere snart.
Avatar billede lap Nybegynder
29. november 2004 - 18:41 #5
Nedenstående kode er kontrolleret og virker. Du skal arbejde på delen med $Element, men den lister alle grupper og hvis gruppen hedder PRN_, så kommer vi ind i if-sætningen.

Der er tilføjet en split således at domænenavn\ lægges på en linie for sig - og dermed ignoreres.

BREAK ON

$Index = 0
DO
  $Group = ENUMGROUP($Index)
  $Index=$Index+1
  $tosplit = $Group($Index)
  $groupsplit = Split($tosplit,'\')
  for each $Element in $groupsplit
    if left($Element,4) = "PRN_"
      ? $Element
    endif
  next
UNTIL Len($Group) = 0
Avatar billede Slettet bruger
29. november 2004 - 18:46 #6
Når jeg kører det, får jeg bare en lang linje med tal?
Avatar billede lap Nybegynder
29. november 2004 - 19:35 #7
Ja, så er der åbenbart ingen grupper med navnet PRN_ - du skal arbejde videre på den inderste del af scriptet.

jeg er ikke helt sikker på, hvad der skriver tallene, men det er jo nok en af linierne - prøv at debug'e på scriptet.
Avatar billede Slettet bruger
29. november 2004 - 19:47 #8
Jeg er startet fra bunden af igen, da jeg ikke kender nok til at kunne debugge andres script.

Jeg er nu ved at have noget brugbart, dog returnerer ENUMGROUP ikke alle grupper en person er medlem af på domænet, men kun de grupper der ligger i samme OU som brugeren selv.
Avatar billede lap Nybegynder
29. november 2004 - 20:10 #9
det undrer mig - hos mig returneres alle grupper fra AD - jeg har lige checket det en ekstra gang.

Debug gøres bare med /d i kommando linien.

--
BREAK ON

$Index = 0
DO
  $Group = ENUMGROUP($Index)
  $Index=$Index+1
  if left($Group,6) = "XX\LD_"
    ? $Group
  endif
UNTIL Len($Group) = 0
--

Jeg har testet ovenstående - og det virker hos mig.
Avatar billede Slettet bruger
29. november 2004 - 20:15 #10
IF InGroup ("PRN_PSERV_EKSP")
  ? "Du er med i gruppen"
ENDIF

Selvom jeg kan se at jeg er med i gruppen, får jeg ikke sendt noget til skærmen med ovenstående kode.

Jeg har prøvet at logge af, samt bruge /F. Det giver ingen forskel.

Ud over at ENUMGROUP lister en masse forskellige lokale grupper, får jeg ikke andre grupper end dem der er placeret i OU'en USERS.

Det er mystisk???
Avatar billede lap Nybegynder
29. november 2004 - 20:18 #11
Så kan du blive nødt til at gå den anden vej (måske mangler der rettigheder et eller andet sted).

Du er nødt til at liste alle grupper i domænet - jeg vender tilbage.
Avatar billede Slettet bruger
29. november 2004 - 20:27 #12
Jeg har administrator-rettigheder på netværket, så det burde ikke være et rettighedsproblem.
Avatar billede lap Nybegynder
29. november 2004 - 20:40 #13
Følgende lister alle grupper i domænet B1-PC:

$Computer = GetObject("WinNT://B1-PC")
dim $filter[0]
$filter[0]="Group"
$Computer.filter = $filter

For Each $Group in $Computer
  ? $Group.Name
Next
Avatar billede Slettet bruger
29. november 2004 - 20:47 #14
Den lister også alt her, incl. de grupper jeg ikke kan få listet med ENUMGROUP.
Avatar billede lap Nybegynder
29. november 2004 - 20:49 #15
fra kixstart help til version 4.22:

Note: Because a security token is created during the logon of a user and does not change while that user is logged on, changes to the user’s group-membership are not visible to KiXtart until the next time the user logs on.
Avatar billede lap Nybegynder
29. november 2004 - 20:50 #16
lidt mere - er det mon problemet?

As both methods of retrieving the group-membership are relatively costly in terms of network traffic and process time the latest update of KiXtart caches the group-membership information in the registry. This means that once the cache is filled, subsequent runs of KIX32.EXE will require much less time to retrieve the group-membership information.

The group-membership cache is stored in the registry hive of the current user and contains security-identifier-to-groupname mappings. Changes to a user's group-membership are automatically handled by KiXtart during the next logon.


Note: If an existing group is renamed, that change will not be visible to KiXtart until the next time the token-cache is refreshed.

The cache is automatically refreshed every 30 days.

A refresh of the cache can also be forced using the new '/f' command line option:

KIX32 <yourscript> /f

Optionally, you can include a date, indicating how old the cache must be for it to be refreshed:

KIX32 <yourscript> /f:2001/12/31
Avatar billede Slettet bruger
29. november 2004 - 20:51 #17
Mit script ser sådan her ud lige nu:

$Index = 0
DO
  $Index  = $Index + 1
  $Groups = ENUMGROUP($Index)

  IF (len($Groups) > 0) OR (left($Groups,12) = "DOMAENE\PRN_")
    $GroupList = $GroupList + $Groups + "¤"
  ENDIF
UNTIL Len($Groups) = 0

$GroupArray = Split($GroupList,"¤",-1)

FOR EACH $Group in $GroupArray
  $Size = len($Group) - 12
  $GroupSplit = right($Group,$Size)
  ? $Group
Next

Hvordan får jeg flettet ovenstående ind?
Avatar billede Slettet bruger
29. november 2004 - 20:52 #18
Tror ikke det hænger sammen med problemet, da jeg har prøvet både /F og at genstarte.
Avatar billede lap Nybegynder
29. november 2004 - 21:00 #19
formentlig således:

$Computer = GetObject("WinNT://DOMAENE")
dim $filter[0]
$filter[0]="Group"
$Computer.filter = $filter

For Each $Group in $Computer
  If left($Group.Name,4) = "PRN_"
    if ingroup($Group.Name)
      $Size = len($Group.Name) - 12
      $GroupSplit = right($Group,$Size)
      ? $Group
      addprinterconnection
    endif
  endif
Next
Avatar billede Slettet bruger
29. november 2004 - 21:12 #20
Så lander vi på problemet igen. Ingroup kan ikke se alle grupper jeg er medlem af, og derfor får jeg igen kun de grupper jeg kan få frem med ENUMGROUP. *suk*
Avatar billede Slettet bruger
29. november 2004 - 21:16 #21
Nu bliver det endnu mere mystisk.

Jeg har oprettet en bruger der kun er alm. Domain user, og på vedkommende kan man godt se alle grupperne.
Avatar billede lap Nybegynder
29. november 2004 - 21:17 #22
tja, så må det laves vha. adsi - hvorledes vises alle grupper en bruger er medlem af:

$User = GetObject("WinNT://B1-PC/" + @USERID + ",user")
For Each $Group in $User.Groups
  ? $Group.Name
Next

virker dette??
Avatar billede Slettet bruger
29. november 2004 - 21:22 #23
Det fungerer perfekt.

Det er godt nok underligt hvad forskel der er på de forskellige måder at spørge på?
Avatar billede lap Nybegynder
29. november 2004 - 21:25 #24
adsi har egentlig ikke noget med kix32 at gøre - men er en "bill gates" metode i stedet for.

Er vi ikke ved at være der, hvor du kan klippe det sammen? Jeg vil foreslå, at du bruger sidste metode som lister grupperne vha. adsi.

Så skal du bare splitte gruppenavne mv.
Avatar billede Slettet bruger
29. november 2004 - 21:28 #25
Vi er nået lige netop dertil hvor jeg gerne ville hen.

Jeg er nået frem til følgende kode, der lister de rigtige grupper, og derfor bare mangler at få stykket et par if-sætninger på.

$GroupMembership = GetObject("WinNT://domaene.local/" + @USERID + ",user")
For Each $Group in $GroupMembership.Groups
  IF left($Group.Name,4) = "PRN_"
    $GroupList = $GroupList + $Group.Name + "¤"
  ENDIF
Next

$GroupArray = Split($GroupList,"¤",-1)

FOR EACH $Group in $GroupArray
  ;$Size = len($Group) - 12
  ;$GroupSplit = right($Group,$Size)
  ? $Group
Next

Læg et svar og der er point på vej :o)
Avatar billede lap Nybegynder
29. november 2004 - 21:30 #26
Det var godt - og ja, det er meget mystisk - måske har din pdc-emulator det travlt? - eller du har mange domain controllere hvor der mangler replikering?
Avatar billede Slettet bruger
29. november 2004 - 21:33 #27
Har du 2 stk. W2K3 Domain controllere, og de har ikke en døjt at lave på denne tid af dagen.
Avatar billede lap Nybegynder
29. november 2004 - 21:35 #28
:-) - det er mystisk - du vender tilbage hvis du får behov for yderligere.

Grundlæggende kan du kikke efter adsi på google - og en del af ovenstående er hugget fra http://www.15seconds.com/issue/020130.htm - men omskrevet fra asp til kix
Avatar billede Slettet bruger
29. november 2004 - 21:38 #29
Okay, will do.

Tak for hjælpen.
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