Avatar billede Syska Mester
27. oktober 2004 - 17:12 Der er 13 kommentarer og
1 løsning

Læse Reg fra remote computer

Henvisning til http://www.eksperten.dk/spm/457393 kan man se liste over installerede programmer, men kan ikke lige hitte ud af hvordan jeg læser fra remote, nogen der har et codeeksemple???

// ouT
Avatar billede tomjelen Nybegynder
27. oktober 2004 - 18:45 #1
Jeg bruger normalt WMI sådan noget, men ved noget googling fandt jeg frem følgende eksempel:

Dim MyReg As Microsoft.Win32.RegistryKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, "dcops2100")

        Dim MyRegKey As Microsoft.Win32.RegistryKey
        Dim MyVal

        MyRegKey = MyReg.OpenSubKey("Software\Microsoft\Windows NT\currentVersion")
        MyVal = MyRegKey.GetValue("RegisteredOwner")
        MyRegKey.Close()
        TextBox1.Text = MyVal

Er godt nok vb.net og den forkerte key, men mon ikke det bare var linien "Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, "dcops2100")" du ledte efter?

Kan oversætte det til c# med http://developerfusion.com/utilities/convertvbtocsharp.aspx
Avatar billede Syska Mester
27. oktober 2004 - 20:05 #2
jo, hvis "dcops2100" er remote maskine ellers kan jeg nok ikke lige gennemskue det... Men kan man via WMI se hvad programmer der er installeret bruger jeg da bare det, synes bare ikke jeg har kunnet finde noget, men det kan selvf bare have været mig...... Kan man det med VMI????
Avatar billede Syska Mester
27. oktober 2004 - 21:06 #3
Tud, det virker...... men hvordan angiver jeg admin rettigheder på remote maskine.... Jeg kan godt hvis jeg først laver en manuel "\\maskinenavn\" men det er jo ikke så fedt :-(, nogen der kender en måde at løse det på???
Avatar billede tomjelen Nybegynder
28. oktober 2004 - 01:01 #4
Er muligt det vil virke med "Microsoft.Win32.RegistryHive.CurrentUser" i OpenRemoteBaseKey i stedet for LocalMachine, men er bare et gæt. Den account du er logget på din egen maskine med, skulle være den der bliver brugt til at tilgå remote maskinen. Så du skal vel have admin rettigheder der, og jeg kunne forstille mig at det også ville fejle hvis "Remote Registry" ikke er startet under "Services" på remote computeren.

Jeg har desværre ikke en maskine jeg kan teste imod, men kan få det til at virke lokalt med:

string strComputerName = "computernavn";
Microsoft.Win32.RegistryKey regBaseKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, strComputerName);

Microsoft.Win32.RegistryKey regInstalledPrograms;
regInstalledPrograms = regBaseKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
string[] arrSubNames = regInstalledPrograms.GetSubKeyNames();

foreach(string strSubName in arrSubNames)
{
    Console.WriteLine(regInstalledPrograms.OpenSubKey(strSubName).GetValue("DisplayName"));
}

regInstalledPrograms.Close();
regBaseKey.Close();
Avatar billede Syska Mester
28. oktober 2004 - 11:07 #5
ja, som jeg siger mangler jeg vare parametre til at angive hvad username/password den skal bruge til at logge på med....
Avatar billede Syska Mester
28. oktober 2004 - 11:08 #6
vare = bare
Avatar billede tomjelen Nybegynder
28. oktober 2004 - 19:43 #7
Der findes ingen parametre til username/password, OpenRemoteBaseKey benytter de windows credentials du er logget på maskinen med, som du afvikler dette stykke kode fra. De credentials ikke har rigtige rettigheder på remote computeren, hvis jeg forstår dig korrekt.. I så fald skal du nok have gang i noget impersonation.

Ikke noget jeg selv har pillet ved før, det eneste jeg lige umiddelbart kan finde på google som ser OK ud er:
http://www.dotnet247.com/247reference/msgs/19/95567.aspx

Som leder mig hen til:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemSecurityPrincipalWindowsIdentityClassImpersonateTopic.asp

Måske er der nogen der har en pænere løsning..
Avatar billede Syska Mester
28. oktober 2004 - 22:43 #8
ja, det ser meget lovende ud......

Du skriver at du normalt bruger WMI??? Kan man trække installere programmer ud med det, hvis så er det løsningen?
Avatar billede tomjelen Nybegynder
29. oktober 2004 - 23:22 #9
Det her virker lokalt, har dog stadig ikke mulighed for at teste det remote, men ManagementScope har properties til at impersonate med og at sætte password/username, så vil tro det virker.
Det kræver dog at WMI er installeret på remote computeren, men WinXP og Win2000+ har det præinstalleret, ældre versioner skal nok downloade og installere det for at virke..


public static void ListInstalledPrograms()
{
    const uint HKEY_LOCAL_MACHINE = unchecked((uint)0x80000002);
    string strComputerName = "computername";
    string strUsername = "username";
    string strPassword = "password";

    ManagementScope objManagementScope = new ManagementScope();
    objManagementScope.Path.Server = strComputerName;
    objManagementScope.Options.Username = strUsername;
    objManagementScope.Options.Password = strPassword;
    objManagementScope.Path.NamespacePath = "root/default";
    objManagementScope.Options.EnablePrivileges = true;
    objManagementScope.Options.Impersonation = ImpersonationLevel.Impersonate;

    ManagementPath objManagementPath = new ManagementPath("StdRegProv");

    ManagementClass wmiRegistry = new ManagementClass(objManagementScope,objManagementPath,null);

    string strKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

    object[] arrMethodArgs = new object[] {HKEY_LOCAL_MACHINE, strKeyPath, null};

    uint intRetVal = (uint)wmiRegistry.InvokeMethod("EnumKey", arrMethodArgs);

    Console.WriteLine("Executing EnumKey() returns: {0}", intRetVal);

    if(null != arrMethodArgs[2])
    {
        string[] arrSubKeys = arrMethodArgs[2] as String[];

        if(arrSubKeys == null)
        {
            return;
        }

        ManagementBaseObject inParam = wmiRegistry.GetMethodParameters("GetStringValue");

        inParam["hDefKey"] = HKEY_LOCAL_MACHINE;

        foreach(string strSubKey in arrSubKeys)
        {
            //Display application name
            strKeyPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + strSubKey;

            inParam["sSubKeyName"] = strKeyPath;
            inParam["sValueName"] = "DisplayName";

            ManagementBaseObject outParam =    wmiRegistry.InvokeMethod("GetStringValue", inParam, null);

            if ((uint)outParam["ReturnValue"] == 0)
            {
                Console.WriteLine(outParam["sValue"]);
            }
        }
    }
}


Husk "using System.Management" og tilføj referencen til projektet.
Avatar billede Syska Mester
30. oktober 2004 - 13:52 #10
arghhh, hvorfor kom min anden besked ikke frem :-(

Nå, men må jo skrive det igen

Det virker jo perfekt som det skal, Hvis du kan give en forklaring på hvad der egentlig sker de forskellige steder, altså hvad det ikke lige er meget simpelt, ville det være fedt, der er mange at de måder du bruger der ikke lige umidbart siger mig noget.

De første ManagementScope kender jeg godt, men måder du tester på  igennem det hele kan jeg ikke lige gennemskue...

smider selvf ekstra point i for det :-P
Avatar billede tomjelen Nybegynder
01. november 2004 - 23:43 #11
Jo da.

ManagementPath("...") er path til den WMI klasse jeg gerne vil bruge. Msdn har en liste over de klasser der er til rådighed på:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_classes.asp

StdRegProv er en klasse til at manipulere med Registry, som har nogle metoder til rådighed til dette formål, de kan findes på:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/stdregprov.asp

Så oprettes der et ManagementClass object som representere den wmi-klasse jeg vil pille ved. Den får mit scope, path'en og null som options.

Da jeg gerne vil kalde metoden "EnumKey" på "StdRegProv"-klassen, til at få listede alle subkeys der er til min registry addresse, skal jeg opstille nogle input parametre til "EnumKey".
Det er hvad arrayet "arrMethodArgs" bliver brugt til. Plads 0 og 1 siger sig selv, plads 2 er outputtet fra vores metodekald. Her vil vi få et array af de subkeys som "EnumKey" gerne skulle returnere til os.
Derefter invokes metoden, "intRetVal" får så retur værdien, som er 0 hvis alt gik efter planen. Denne retur værdi kan i nogle tilfælde fortælle os, noget brugbart om hvorfor vores kald fejler, eller om remote computeren skal rebootes før vores ændring tager effekt, og den slags ting.

Nu har vi alle vores subkeys, nu skal vi bare have navne på programmerne. Det gør vi ved at læse værdien af "DisplayName" for alle vores subkeys.
Metoden "GetStringValue" på "StdRegProv" er handy her. wmiRegistry.GetMethodParameters("GetStringValue") skaffer os et object til at sætte input parametre på. Så dem udfylder vi, og metoden "GetStringValue" invokes for hver subkey vi har.

Håber der forklare noget af det, ellers bare spørg løs, så skal jeg se om jeg kan svare på det :)
Avatar billede Syska Mester
03. november 2004 - 19:33 #12
jo, gider da en hel del mere forklaring med de godeforklarende ord :-P

Men der er nok stadig nogle ting som:
GetMethodParameters() og InvokeMethod()
men helt klart bedre forstået af det hele.....

Men de 2 Functions kommer jeg nok til at kende når jeg også kommer meget længere med C#, stadig lidt grøn men man lærer hele tiden noget....
Kaldes det noget bestemt, hvis jeg vil lære mere om det Invoke, synes det står mange steder når man kigger rundt, og den GetMetmodParameters, synes jeg også er nogle steder, her er det jo nogle helt genialle ting man kan få ud, ved hjælp af dem og så WMI, i stedet for at læse på den anden måde fra registrerings databasen.

Da jeg skrev det her gik der lidt lidt mere op for mig hvad der sker, så der er vist ikke mere lige nu, men hvis du smider et svar, så skal du få dine point? Ville du have lidt flere for dine anstrængelser?
Avatar billede tomjelen Nybegynder
03. november 2004 - 21:26 #13
Er fint nok med de 30 point.

Invoke betyder bare noget i retning af "kalde, benytte, bruge, etc.". Så jo, metoder hvor ordet invoke indegår i navnet er rimlig normalt, da det er noget man tit gør. "InvokeMethod()" ligger på "ManagementClass" klassen, som ligger i namespacet "System.Management". "System.Management" namespacet indeholder en bunke klasser, som egentligt bare er en skal rundt om WMI til Windows, for at gøre det nemmere at arbejde med for os.
Så "wmiRegistry.InvokeMethod("EnumKey", arrMethodArgs);" betyder bare at, vi fra vores ManagementClass kaldet wmiRegistry, vil anvende/kalde WMI-metoden "EnumKey".
I andre namespaces kan der også ligge metoder hvor ordet invoke indegår, højest sandsynligt bruges de også til at anvende/kalde et eller andet, eftersom metoden er blevet navngivet sådan. Men udover det, er der ikke umidddelbart noget andet sammenhæng til "ManagementClass.InvokeMethod".

"GetMethodParameters()" er som bare en metode et sted i "System.Management" namespacet vi kan benytte os af. Den kan kaldes sammen med navnet på et WMI object, og så giver den os et object tilbage, hvor vi kan angive input parametre til WMI objectet. Senere ser du at samme WMI object bliver invoket, sammen med dette input object. Jeg burde nok have brugt samme metode oppe i starten, inden jeg invokede "EnumKeys".

WMI kan godt være lidt kringlet til tider.. Men hvis man skal til at pille ved computer indstillinger og andre ting som WMI er godt til, så kan man for det meste finde færdigskrevet løsninger på ens problemstilling, hvis bare man googler på det sammen med "WMI" som søgeord :)
Avatar billede Syska Mester
03. november 2004 - 21:45 #14
jeps, WMI er godt, og har googlet en masse og spurgt andre, men du er den første der svarer at man også kunne få programmer listet som er installeret, eller i det hele taget bare søge i registrerings databasen....
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