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.