28. november 2004 - 17:04Der 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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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
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
Synes godt om
Slettet bruger
29. november 2004 - 18:46#6
Når jeg kører det, får jeg bare en lang linje med tal?
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.
Synes godt om
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.
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.
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:
$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
Synes godt om
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*
Synes godt om
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.
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.
Synes godt om
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
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?
Synes godt om
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.
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.