Onverklaarbare netwerkactiviteit onder Windows door BITS

Noud van Kruysbergen
0

Heb je onder Windows last van onverklaarbare netwerkactiviteit, dan kan dat liggen aan de ‘Background Intelligent Transfer Service’ (BITS). Gelukkig zijn er tools waarmee je kunt zien wat BITS allemaal uitspookt.

Een bestand van internet downloaden is makkelijk: je typt het adres in een browser in en afhankelijk van de grootte van het bestand en de verbindingssnelheid moet je dan even wachten … en klaar. Ontwikkelaars die een programma of script toegang willen geven tot data van internet kunnen dat net zo makkelijk doen.

Er zijn situaties waarin een stuk gecompliceerder wordt. Als de server aan de andere kant niet te bereiken is, moet je het downloadverzoek een of meerdere keren herhalen. Bepaalde dataoverdrachten zijn wellicht minder belangrijk of tijdkritisch en moeten het doen met de bandbreedte die overblijft als je tegelijk een videostream aan het bekijken bent. Op mobiele apparaten is het slim om dit soort downloads alleen uit te voeren als je een snelle wifi-verbinding hebt, zodat je niet je databundel er doorheen jaagt. Er zijn gevallen waarbij het ontvangen van data enorm lang duurt omdat het gaat om grote hoeveelheden of omdat de netwerkverbinding enorm traag is. Dan zou het fijn zijn als je de pc tussendoor kunt uitzetten en het downloaden na het herstarten weer vanzelf doorgaat.

BITS

Bij Windows kun je de Background Intelligent Transfer Service gebruiken, oftewel BITS. Sinds Windows XP maakt BITS onderdeel uit van het besturingssysteem. BITS kan bestanden zowel uploaden als downloaden. Voor het overdragen van gegevens wordt http of https gebruikt plus smb, oftewel Windows-shares.

Ontwikkelaars moeten BITS kunnen gebruiken met hun apps en programma’s (zie Background Intelligent Transfer Service). Windows heeft twee tools waarmee je aan de slag kunt: het commandlineprogramma BITSAdmin en een reeks Cmdlets in de Windows PowerShell.

Windows gebruikt BITS zelf erg fanatiek. Vooral voor de dienst Windows Update, die daar patches mee downloadt. Ook de wisselende achtergronden vanuit Bing belanden via BITS op je desktop. Sommige apps binnen Windows 8 en 10, bijvoorbeeld voor nieuws en sport, gebruiken BITS om de afbeeldingen voor de live-tegels bij te werken.

Helaas hebben ook malware-ontwikkelaars en botnetbeheerders BITS inmiddels ook ontdekt. Netwerkactiviteiten van BITS zijn nu eenmaal minder verdacht dan een onbekend programma dat ineens vele MB’s aan data downloadt. Dat maakt BITS ideaal om onopgemerkt extra code binnen te halen en buitgemaakte gegevens te versturen. Heb je het gevoel dat er continu data worden verstuurd via je netwerkverbinding, maar kun je niet verklaren waardoor dat gebeurt, dan is het misschien verstandig eens na te gaan wat de BITS-dienst op je pc aan het uitspoken is.

Opbouw BITS-job

Het is eerst van belang te kijken naar de opbouw en levenscyclus van een BITS-job. De belangrijkste attributen zijn:

  • een unieke job-ID in de vorm van een GUID
  • een naam
  • optioneel een beschrijving vanuit het programma dat er gebruik van maakt
  • het useraccount waar de job bij hoort
  • een job-status
  • een van de vier mogelijke prioriteitsniveaus
  • een job-type met als mogelijkheden download, upload, en upload met reply-download
  • een lijst met over te zetten bestanden, elk met bron- en doeladres/pad
  • totale datavolume en datavolume tot nu toe
  • informatie over fouten die mogelijk zijn opgetreden

Het overzetten van data via BITS verloopt eigenlijk altijd volgens hetzelfde schema. De gebruiker (of een programma) maakt een lege en suspended job aan met een naam en krijgt dan de ID door. In de volgende stap geef je aan welke bestanden er verstuurd moeten worden (bij downloads tot 200 per job) door de url’s en lokale paden aan te geven. Je kunt opties aangeven als de gewenste prioriteit en wat er moet gebeuren met de job als er fouten optreden. Daarna activeer je de job met de Resume-method.

Vervolgens zet BITS de opdracht in een queue en werkt hij hem af zodra hij aan de beurt is. Als alles goed gaat, komen de data binnen en kan de opdrachtgever de job sluiten (Complete). Na die laatste stap gaan de verstuurde bestanden echt over in handen van de gebruiker: gedownloade bestanden worden hernoemd van *.tmp naar hun uiteindelijke namen en gesloten. BITS haalt de opdracht dan uit zijn to do-lijst.

BITSAdmin om jobs te beheren

Windows biedt voor het beheren van BITS-jobs onder andere de commandlinetool BITSAdmin. Deze waarschuwt je sinds Windows 7 elke keer dat je hem aanroept echter dat hij eigenlijk verouderd is en mogelijk niet meer in toekomstige versies van Windows zit. In Windows 8, 8.1 en 10 zit BITSAdmin echter nog steed. Je kunt anders altijd de PowerShell nog gebruiken.

BITS - bitsadmin

Met het programma BITSAdmin beheer je BITS-jobs via de commandline. Met de parameter/verbose krijg je een veelvoud aan informatie voorgeschoteld.

Om met BITSAdmin een bestand via BITS van internet binnen te halen, moet je de stappen hierboven met commando’s doorlopen. Het eerste commando is

bitsadmin /create /download MyJob

De naam (Myjob) is vrij te kiezen. Je maakt het jezelf een stuk makkelijker door korte namen te gebruiken en er op te letten dat je niet twee jobs aanmaakt met dezelfde naam. BITSAdmin maakt verschil tussen kleine letters en hoofdletters. De optie /download kun je weglaten omdat die standaard is. De andere opties zijn /upload en /upload-reply. De /create-opdracht geeft als alles goed gaat een reply volgens het patroon Created job {A4B52490- 495D-4F37-BE0C-8084A480DAAF}. De waarde tussen de accolades is de job-ID.

In de volgende stap vertel je de job welke bestanden er verstuurd moeten worden:

bitsadmin /addfile MyJob http://server.com/path/file.zip C:Downloadsfile.zip

Voor elke download heeft BITS een url (of een UNC-pad) van het bestand nodig en een lokaal pad waar het bestand moet worden opgeslagen. Bij downloadjobs kun je het commando meerdere keren gebruiken. BITS werkt de bestanden dan één voor één af. Als de naam voor een job niet eenduidig is, kun je ook de job-ID aangeven, inclusief de accolades en tussen aanhalingstekens.

Opties voor BITSAdmin

Voordat je het versturen van bestanden begint, kun je voor een job nog een aantal opties instellen. Een daarvan is de prioriteit waarmee BITS de opdracht afhandelt. Er zijn vier prioriteiten: foreground, high, normal en low. Normal is de standaardwaarde. Foreground-jobs worden met de maximaal beschikbare snelheid afgehandeld. Daarbij wordt geen rekening gehouden met andere datatransfers die tegelijkertijd plaatsvinden. De andere drie niveaus gebruiken altijd alleen de bandbreedte die je browser en streamingclient en dergelijke overlaten. BITS voert opdrachten van lagere prioriteit pas door als er geen jobs met hogere prioriteit meer liggen. De prioriteit van een job verander je met het commando

bitsadmin /setpriority MyJob high

Andere opties waarmee je BITS-jobs kunt finetunen, waaronder het invoeren voor een proxy-server of inloggegevens voor de server waar de bestanden vandaan komen, worden beschreven bij het commando bitsadmin /? en bij de BITSAdmin Tool.

Als alles naar wens staat ingesteld, kun je de opdracht starten met

bitsadmin /resume MyJob

waardoor hij in de queue van BITS belandt. De voortgang van het versturen kun je bekijken met

bitsadmin /info MyJob

Voor nog meer details kun je /verbose gebruiken. Een alternatief is om via

bitsadmin /list

een overzicht van alle BITS-jobs te laten zien die onder de huidige gebruiker draaien, oftewel aangevraagd zijn door programma’s die onder het account draaien. Ook hier kun je /verbose weer gebruiken voor meer details. Met

bitsadmin /list /allusers

toont BITSAdmin een lijst met alle huidige opdrachten. Hierbij zitten ook de opdrachten die bij andere gebruikersaccounts horen. Daarvoor moet je de Opdrachtprompt uitvoeren met adminrechten. Dan zie je bijvoorbeeld ook wat de Windows Update-dienst op dat moment aan het downloaden is, aangezien deze onder systeemrechten draait.

Voortgang bekijken

Een andere handige optie om de voortgang van BITS-operaties in de gaten te houden is het commando

bitsadmin /monitor /refresh 2

dat elke twee seconden een bijgewerkte lijst met draaiende BITS-opdrachten toont. Als je het /refresh gedeelte weglaat, krijg je elke vijf seconden een bijgewerkt overzicht. Ook dit commando kan de flag /allusers gebruiken. De toetscombinatie Ctrl+C breekt de opdracht af. Als alles goed gaat, krijgt je download op een gegeven moment de status ‘transferred’. De daadwerkelijke dataoverdracht is dan afgesloten, maar het doelbestand heeft nog zijn tijdelijke bestandsnaam en is verborgen. Deze hoort nog aan BITS toe. Hij geeft het uit handen met het commando

bitsadmin /complete MyJob

De opdracht is hiermee afgesloten en verdwijnt uit de joblijst.

Het is mogelijk om BITSAdmin te gebruiken met wat minder uitgebreide commando’s om bijvoorbeeld snel even een bestand te up- of downloaden. Dan kun je van een aantal voordelen van BITS geen gebruik maken. Het commando

bitsadmin /transfer MyJob /download http://server.com/path/file.zip C:Downloadsfile.zip

maakt in één keer een downloadjob aan, geeft hem de opgegeven prioriteit en bron-url en doellocatie mee, geeft hem door aan de BITS-dienst en roept na het afsluiten automatisch complete aan. De flag /download is standaard en kun je weglaten. Zolang de transfer bezig is, informeert BITSAdmin continu naar de voortgang. De download wordt echter niet echt op de achtergrond uitgevoerd. Anders dan bij de eerdere bitsadmin-commando’s breekt hij af zodra je het programma met Control+C onderbreekt, de Opdrachtprompt sluit of jezelf afmeldt.

PowerShell

BITS - powershell

Microsoft geeft de voorkeur aan de PowerShell als het gaat om het beheren van BITS. Lijstjes kun je hiermee naar eigen inzicht opmaken en filteren.

Microsoft geeft zelf aan om voor het beheer van BITS-jobs niet meer BITSAdmin te gebruiken, maar de PowerShell. Je moet zelf bepalen welke tool je voorkeur heeft. Je moet je wel bewust zijn van een aantal voor- en nadelen. Een nadeel van PowerShell is dat je niet alle opties van BITS-jobs kunt aangeven. Met name de opties die de transfer van bestanden binnen Windows-domeinen beïnvloeden. Daaronder vallen schakelaars voor het overnemen of negeren van ACL’s en het gebruik van BranchCache. Ook kent de PowerShell geen Cmdlet die bitsadmin /monitor kan vervangen.

Een pluspunt is dan weer wel dat PowerShell te gebruiken is om een flag toegankelijk te maken die de omgang met netwerkverbindingen regelt als er sprake is van kosten bij dataverkeer. Je hoeft niet strikt te kiezen voor een van beide tools. Met BITSAdmin aangemaakte opdrachten kun je ook met de PowerShell in de gaten houden of beïnvloeden, en andersom.

Commando’s

Het simpelste PowerShell-commando voor BITS komt overeen met bijvoorbeeld bitsadmin /transfer:

Start-BitsTransfer http://server.com/path/file.zip C:Downloadsfile.zip DisplayName MyJob

Dit start een download, wacht totdat deze klaar is en houdt je ondertussen op de hoogte van de voortgang. Daar kun je extra parameters bij gebruiken. Zo draait -TransferType Upload de richting van de transfer om en -Priority Foreground zet de prioriteit op maximaal. De parameter -TransferPolicy geeft aan hoe BITS met de job moet omgaan zodra er kosten zijn verbonden aan het dataverkeer. In Get-Help Start-BitsTransfer – Detailed staan de te gebruiken waarden. Als dat niet uitmaakt, gebruik je Always. Dat is de standaardwaarde voor BITS-jobs die je via PowerShell aanmaakt. Het andere uiterste, waarbij je alleen data verbruikt als het niks kost, heet gek genoeg Policy-Unrestricted. Met BITSAdmin aangemaakte jobs hebben het attribuut Standard, waarmee dataoverdrachten alleen voorkomen als een databundel/datalimiet bijna of helemaal op is.

Asynchroon downloaden

Een asynchrone download start je met

$job = Start-BitsTransfer [bron] [doel] [parameters] -Asynchronous

Met

$job | Format-List

word je op de hoogte gehouden van de voortgang. Zodra de regel JobState de waarde Transferred bevat moet je de job via

$job | Complete-BitsTransfer

afsluiten en zo het bestand toegankelijk maken.

Een lijst met de BITS-jobs die op dit moment draaien, krijg je te zien met

Get-BitsTransfer

Met de opties -Name MyJob of -JobId met daarachter een GUID van 36 tekens (zonder accolades) kun je de output filteren. In een PowerShell met adminrechten heeft het commando ook de parameter -Allusers. Zoals gebruikelijk bij de PowerShell, kun je de output via een objectpipeline doorsturen naar andere Cmdlets of variabelen toewijzen.

De andere BITS-Cmdlets van de PowerShell zijn voor thuisgebruik niet zo boeiend. Je leest er meer over in de uitvoerige documentatie met veel voorbeelden.

(Martin Fischer/avs)

Levenscyclus van een BITS-job

windbitsEen nieuw aangemaakte job krijgt standaard de status Suspended, totdat de opdrachtgever hem wakker maakt met Resume. Zodra de transfer succesvol is afgerond, moet je de job afsluiten met Complete. Voor de overzichtelijkheid hebben we hieronder niet aangegeven dat jobs bij niet te corrigeren fouten de status Error krijgen. Het aanroepen van de methode Cancel breekt de job in elke fase af naar de toestand Cancelled.

 

Meer over

Netwerken

Deel dit artikel

Noud van Kruysbergen
Noud van KruysbergenNoud heeft de 'American Dream' doorlopen van jongste bediende tot hoofdredacteur van c't, waar hij zo veel mogelijk de diepgang, betrouwbaarheid en diversiteit wil bewaken.

Lees ook

Dit kun je verwachten als je ChatGPT als hacking-tool wilt gebruiken

Kun je ChatGPT gebruiken als hacking-tool? We neigden naar de duistere kant en onderzochten of de assistentie van een AI van elke scriptkiddie een eli...

Raspberry Pi GPIO pinnen: een overzicht van de aansluitingen

Een kleine Raspberry Pi board is zo volgepakt met alle componenten dat er geen ruimte meer over was om de 40 GPIO pinnen van informatie te voorzien. O...

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er