lmiwbem - Csoportok, felhasználók

0 votes
asked Apr 4, 2015 in IRF tantárgy by Arklur (68 points)  

A feladatom az, hogy kilistázzam a gépen lévő csoportokat, és a hozzájuk tartozó felhasználókat (opcionálisan hozzájuk 1-2 infót is).

Az alábbi táblákat próbálom ehhez használni:
1) LMI_Account: Ez tartalmazza a felhasználók adatait (innen kell ha jól gondolom a Name, HomeDirectory és a UserID).
2) LMI_MemberOfGroup: Ez a kulcsa (szerintem) a feladatnak, ez a tábla tartalmazza a csoportokat, és hogy mely felhasználók tartoznak hozzá.

A problémám, hogy a 2)-es csak UID-ket tárol, nem neveket, így az 1)-esben nem tudok rákeresni a felhasználóra, mert nem tudom a felhasználó nevét, csak annak UID-jét. Az LMI_Identity táblával próbáltam ezt megoldani, de ez meg nem sok segítséget nyújt:

enter image description here

Vakvágányon vagyok a feladatmegoldásában, vagy csak nem találom a megfelelő "táblát"?

Előre is köszi a segítséget!

1 Answer

0 votes
answered Apr 4, 2015 by kovari (2,221 points)  
selected Apr 4, 2015 by Arklur
 
Best answer

Az Account is tartalmaz UserID-t, ami ugye megegyezik a MemberOfGroupban található azonosítóval (nyilván kell egy string darabolás, mert utóbbi nem csak a számot tartalmazza). Tehát megvan a kapcsolat a kettő között. Az ID segítségével megkapod a nevet is ugye.

Edit:

Ha pedig az okozta a félreértést, hogy ez a kettő ugyanaz-e vajon, akkor a válasz igen, ugyanaz.

commented Apr 4, 2015 by Arklur (68 points)  
edited Apr 5, 2015 by Arklur
Ezzel ( https://github.com/phatina/python-lmiwbem/blob/master/examples/example_get_instance.py ) a példával akartam dolgozni.

Ebből a

    # First, create CIMInstanceName.
    tester_iname = lmiwbem.CIMInstanceName(
        cls,
        lmiwbem.NocaseDict({
          'CreationClassName': cls,
          'Name': account,
          'SystemCreationClassName': 'PG_ComputerSystem',
          'SystemName': hostname}),
        'virt-rawhide',
        'root/cimv2')
    
    # Get Instance.
    account = conn.GetInstance(
        tester_iname,
        LocalOnly=False,
        IncludeQualifiers=True,
        IncludeClassOrigin=True)

rész releváns, ahol gondoltam akkor a **'Name' : Account** helyére beírom a **'UserID : userID'**-t (Itt persze konkrét ID áll (pl. 1000). Próbáltam változóval (amit megkapok), próbáltam beírni stringként, számként, de egyik sem tetszett neki).

                    # First, create CIMInstanceName.
                    tester_iname = lmiwbem.CIMInstanceName(
                        "LMI_Account",
                        lmiwbem.NocaseDict({
                          'CreationClassName': "LMI_Account",
                          'UserID' : userID,
                          'SystemCreationClassName': 'PG_ComputerSystem',
                          'SystemName': 'localhost'}),
                        'virt-rawhide',
                        'root/cimv2')

                    # Get Instance.
                    account = conn.GetInstance(
                        tester_iname,
                        LocalOnly=False,
                        IncludeQualifiers=False,
                        IncludeClassOrigin=False)

Erre viszont az alábbi hibát kapom:

    (6, 'CIM_ERR_NOT_FOUND')

(Ha "visszacserélem" **'Name' : Account**-ra (Account helyére egy létező felhasználót), akkor nincs hiba.)

Mit csinálok rosszul, miért szál el a hibával a "**GetInstance**"? Hogyan kellene a konkrét user-re rákeressek, ha már tudom az UID-ját?

Viszont egyúttal egy másik hiba is adódott: ha el is jutok odáig, hogy megvan egy LMI_Account instance, ha leszeretném kérdezni a value-kat (**account.values()**), akkor egy másik hibával elszáll:

    name 'basestring' is not defined

Borúra derű, hogy végül is megoldás rá a **print(account["UserID"])**, de azért furcsa, hogy egy tulajdonképp dict elszáll, ha az értékeit leakarom kérdezni (bár így legalább nincs / nem lesz felesleges lekérdezés...).
commented Apr 4, 2015 by kovari (2,221 points)  
Ezt a GetInstance-t most hirtelen nem próbáltam ki, de amúgy biztos, hogy szükséges ez? Miért akarod egyesével lekérdezni a felhasználókat? Végül úgyis ki kell mentened az összeset a csoportjuk szerint beosztva, így egyszerűbb és optimálisabb is, ha lekérdezed mindet, aztán lokálisan feldolgozod.

A basestringes hiba egy nem létező property miatt van. Felmerült ez ma egy másik kérdés kapcsán is.
commented Apr 4, 2015 by Arklur (68 points)  
Ez mondjuk igaz, erre nem is gondoltam, hogy lokálisan dolgozzam fel. Valószínűleg akkor ez működni fog, köszi a segítséget újból :).
...