IP cím megváltoztatása programból, win10 alatt

Adott egy PIPO X8 nevű touchscreen-es kijelző alá épített minipc, ami bedrótozottan win10-et futtat.
Adott egy program, ami a háttérben fut és ha elérhető egy adott oldal, akkor feldobja a Google Chrome-ot kiosk/incognito módban az adott oldallal.
Az oldalról letölthető egy "IP állító" program, ami a IPv4, subnet mask és gateway értékeit hivatott beállítani.Ezt a beállítást a netsh exec()-el történő meghívásával csinálja, ami xp és 7-es alatt működik, de itt nem. Ha a parancssorba becopyzom a kiadott utasítást, akkor elhajt, hogy adminisztrátori jogkör szükséges. A futtató user adminisztrátori jogosultságokkal rendelkezik. Természetesen, ha azt kérem, hogy command prompt as admin, akkor működik, de nekem ugyanezt a programból kéne kiadnom és nem pedig a cmd.exe-ből. Próbáltam a runas /user:administrator segítségével végrehajtatni, de azt se engedte.

A kód:

Exec('netsh interface IPv4 set address name="Ethernet 2" source= static addr=' + edit1.text + '.' + edit2.text + '.' + edit3.text + '.' + edit4.text + ' mask=' + edit5.text + '.' + edit6.text + '.' + edit7.text + '.' + edit8.text + ' gateway=' + edit9.text + '.' + edit10.text + '.' + edit11.text + '.' + edit12.text + ' 1');

Aztán, próbáltam egy winapi-s függvényt is, ami állítólag beállítaná ezeket a címeket:

procedure SetStaticIpAddress(const NetworkCard, IPAddress, Mask, GateWay :string);
const
  WbemUser ='';
  WbemPassword='';
  WbemComputer='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet : OLEVariant;
  FWbemObject : OLEVariant;
  FOutParams : OLEVariant;
  vIpAddress : OLEVariant;
  vGateWays : OLEVariant;
  vMask : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin
  CoInitialize(nil);
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);

  FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT * FROM Win32_NetworkAdapterConfiguration Where Description="%s"',[NetworkCard]),'WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  if oEnum.Next(1, FWbemObject, iValue) = 0 then
  begin
    vIpAddress := VarArrayCreate([0, 0], varVariant);
    vIpAddress[0]:= IPAddress;
    vMask := VarArrayCreate([0, 0], varVariant);
    vMask[0]:= Mask;
    FOutParams:=FWbemObject.EnableStatic(vIpAddress, vMask);

    vGateWays := VarArrayCreate([0, 0], varVariant);
    vGateWays[0]:= GateWay;

    FOutParams:=FWbemObject.SetGateways(vGateWays);
  end;
  CoUninitialize;
end;

Ez elszáll "invalid query" hibával.

Aztán próbáltam a HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<GUID> alatt beállítani, ami kézzel sikerült is, de ezzel két problémám is akadt: az egyik, hogy hogyan kérem le egy adott eszköz interface GUID-jét, hogy tudjam melyik alatt kell belepiszkálni, (mert ezt programból kell beállítanom és nem szemmel néznem, hogy ez lesz az, vagy sem), a másik, hogy a változást a rendszer nem veszi észre magától, újra kell indítani, vagy legalábbis a hálózatot újra kéne húzni, de az ipconfig /renew nem ment.

Tehát akkor az érdemi kérdések:
- Hogyan tudom elérni, hogy a netsh parancsot meg tudjam hívni a programból, elevated accessel?
- Mi a baja a winapi-s függvénynek?
- Hogyan tudom lekérni egy interface GUID-jét (a név ismert) és utána újrahúzatni a hálózatot, miután a registryben átírtam amit kell?

A három kérdés közül ha egyre választ kapok, már megoldódik a probléma.

Előre köszönöm a segítséget.

Hozzászólások

"próbáltam a HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<GUID> alatt beállítani, ami kézzel sikerült is"
Programból nem fog, elevated access hiányában.

"Hogyan tudom elérni, hogy a netsh parancsot meg tudjam hívni a programból, elevated accessel?"
Röviden: sehogy.

"Mi a baja a winapi-s függvénynek?"
Az elevated access hiánya.

"Hogyan tudom lekérni egy interface GUID-jét (a név ismert) és utána újrahúzatni a hálózatot, miután a registryben átírtam amit kell?"
Mivel nem tudod átírni, a kérdésre lényegtelen a válasz. :)

Ha a Winnel azt csinálsz, amit akarsz, akkor írd meg külön service-ként, induljon a Windowszal system jogon, hallgasson valahol, ahova átadod az IP-t, és csinálja meg a service a váltást.

Már megoldottam: ha a HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA kulcsot zéróra állítom, akkor a felhasználó által futtatott programok mindig elevated accessel futnak. Így a megoldás az lett, hogy fenti kulcs nullázása, majd utána a programban már megy a registry értékek átírása és aztán a reboot.

Ez nem a főnököm hibája, a gépek csak a minap érkeztek (jó sok késés után, hurrá Kína) és mivel a program már rég kész volt és xp meg 7-es alatt ment, így azt hittem, hogy menni fog 10-es alatt is, csak fel kell rakni. Hiba volt. Azt én értem, hogy sok a hülye, meg sok a vírus és az ms kínjában már minden marhaságot kitalál - leginkább minden kattintásra rákérdez, hogy most te kattintottál oda, vagy meghekkelték a gépedet - de nem értem, hogy miért nem teszik ezt opcionálissá; legyen valahol egy beállítás, hogy "tudom mit csinálok, kapcsold ki ezt a sok blockert a francba" és ennyi. Külön szívás volt, hogy erre a gépre home verziót tettek és a normál verzióval ellentétben - ahol legalább ilyen eldugott felületeken megvolt a lehetőség a blockerek egyesével történő kikapcsolgatására - ebből az ms gondosan kigyomlált minden ilyen lehetőséget.

De, hogy ne csak az ms legyen ekézve a hordozhatóság, meg a kompatibilitás miatt, elmondom, hogy a webes felületen a szervízkártyás beállításoknál volt két db. number típusú HTML input mező, amikbe egy odarajzolt numerikus keypaddal lehetett bepötyögni a számokat (a terminál érintőképernyős, egér és billentyűzet nincsen, egy zárt dobozba van bezárva az egész) és ez Opera 12-ben ment, Firefox 45-ben dettó. Ehhez képest a gépre felpakolt vadiúj Chrome és Firefox nemes egyszerűséggel közölték, hogy number típusú mezőre a selection nem támogatott többé (a caret pos-t, azzal lehet lekérni). Magyarul pár verzióval korábban ezt még simán megcsinálták a böngészők, most meg nem, mert csak. Nem tudom ennek mi értelme volt, de biztos van rá valami szakmai magyarázatnak álcázott bullshit, hogy miért kell valamit kivenni, ami amúgy működik.

Mintha az egész ipar arra gyúrna rá, hogy ami tegnap még működött, azt mára tönkre kell tenni, mert nem jó, ha nem rossz.

Ez olyan volt, mint amikor a kezdő linuxosok akarják mindenáron megszüntetni a jelszó bekérést... Fentebb javasolták, hogy auto DHCPt állíts a terminálon, és rendelj hozzá egy statikus IPt a routerben. Legalább nem szivat így meg. Gyors, egyszerű. Amúgy a Win10 meg kellene jelenítsen virtuális billentyűzetet ha tapis képernyőn akarsz form/input-ba pötyögni, nem? Minek külön num keypadot varázsolni? Vagy valami spéci oka van?

Én meg már elmondtam, hogy nem én állítom össze a hálózatot; a feladat ez volt, ezt kellett megoldani. Nincs DHCP. A virtuális billentyűzetet nem lehet használni, mert az oprendszert teljesen ki kellett takarni, csak a kioszk módban futó böngésző és a benne lévő weblap látható.

Az a baj, hogy én UNIX-okra fejlesztek, a winhez nem értek és ennek ma kész kell lennie, nincs időm beleásni magam, mert még ezen kívül is van dolgom a projekttel. Egyébként nem tudom, hogy az elevated access hiánya az IP helpernek is meggátolná-e az állítgatást, mert az alapján, amit blr írt, meg kéne, hiszen ezt is ugyanaz a sima process hívta volna meg.

És mondom, zárt hálózaton fog futni, van egy db. Linuxos szerver, meg az egy db. win10-es munkaidőterminál, nincs netre kötve a rendszer; azonfelül zárt dobozban lesz, egér, billentyűzet és USB portok nélkül, csak a LAN-on ülő szerveren lévő weblap fog látszani. Így a megtörés miatt szerintem nem kell félni.

Ha kellene, nem így lenne kezelve a dolog.

Értem. Tehát ez igazából egy egyszeri művelet lesz, nem?
Ha igen, akkor a rendszer telepítésekor kell ezt beállítani, és akkor már nem feltétlenül a programból tenném meg, hanem eleve a Win felületéről. Hisz a rendszer telepítését nem a felhasználó fogja végezni, nem?

Elevated jog is játszhat, rákérdezés nélkül.
A trükk az, hogy készíteni kell egy ütemezett feladatot, ami az alkalmazást elindítja, a feladatnál be lehet állítani, hogy rendszergazda módban fusson. Időzítést nem kell neki adni.
Ezután az alkalmazás így indítható:

C:\Windows\System32\schtasks.exe /run /tn "feladat neve"

Így kiemelt joggal fog futni és nem fog kérdezni sem.

Gábor