How to obtain disk defragmentation report?  Download
The programmatic defragmentation becomes possible in Windows Server 2003, or later operating system. It may be performed on a local or a remote server. Windows XP workstation may also invoke the remote defragmentation on a server.

The Delphi function below prints out the defragmentation analysis report for the disk the local or remote computer. This example utilizes TWmiQuery, TWmiMethod and TWmiConnection components. The source code below creates and destroys the components on the fly, so this function may be easily adopted for console- or UI-type applications.

// This procedure prints defragmentation analysis report for the
// disk on the target computer.
// When used for local host, the only required parameter is 
// Volume, for example "c:"
// 
// For remote computer, parameters must be: 
// TargetHost: name or IP address of the host, like '10.8.36.54' 
// UserName: name of the user, may include domain, like 'MOON\Administrator'; 
// Password: the user's password. 
// Volume: the volume to run report for, for example "c:" 
procedure PrintAnalysis(TargetHost, UserName, Password, Volume: string);
var
  vConnection: TWmiConnection;
  vQuery: TWmiQuery;
  vMethod: TWmiMethod;
  vSQL: string;
  vResult: integer;
  vAnalysisObj: OleVariant;
  vNeedsDefragment: boolean;
begin
  vConnection := TWmiConnection.Create(nil);
  vQuery      := TWmiQuery.Create(nil);
  vMethod      := TWmiMethod.Create(nil);
  vQuery.Connection := vConnection;
  vMethod.WmiObjectSource := vQuery;
  try
    vConnection.MachineName := TargetHost;
    vConnection.Credentials.UserName := UserName;
    vConnection.Credentials.Password := Password;

    // try to connect. It may fail if the destination computer does not have
    // WMI (like windows 95, 98, NT without WMI core installed), or
    // if the provided credentials are not valid
    try
      vConnection.Connected := true;
    except
      Exit;
    end;

    vSQL := 'select * from Win32_Volume where name = "' + volume + '\\"';
    vQuery.WQL.Add(vSQL);
    vQuery.Open;
    if not vQuery.EOF then
    begin
      vMethod.WmiMethodName := 'DefragAnalysis';
      vResult := vMethod.Execute;
      if vResult = 0 then
      begin
        vNeedsDefragment := vMethod.OutParams.ParamByName('DefragRecommended').AsBoolean;
        if (vNeedsDefragment) then
          writeln('You should defragment this volume.')
          else writeln('You do not need to defragment this volume.');

        vAnalysisObj := vMethod.OutParams.ParamByName('DefragAnalysis').Value;
        writeln;
        writeln('Volume size: ', vAnalysisObj.VolumeSize);
        writeln('Cluster size: ', vAnalysisObj.ClusterSize);
        writeln('Used space: ', vAnalysisObj.UsedSpace);
        writeln('Free space: ', vAnalysisObj.FreeSpace);
        writeln('Percent free space: ', vAnalysisObj.FreeSpacePercent);
        writeln;
        writeln('Total fragmentation: ', vAnalysisObj.TotalPercentFragmentation);
        writeln('File fragmentation: ', vAnalysisObj.FilePercentFragmentation);
        writeln('File space fragmentation: ', vAnalysisObj.FreeSpacePercentFragmentation);
        writeln;
        writeln('Total files: ', vAnalysisObj.TotalFiles);
        writeln('Average file size: ', vAnalysisObj.AverageFileSize);
        writeln('Total fragmented files: ', vAnalysisObj.TotalFragmentedFiles);
        writeln('Total excess fragments: ', vAnalysisObj.TotalExcessFragments);
        writeln('Average fragments per file: ', vAnalysisObj.AverageFragmentsPerFile);
        writeln;
        writeln('Page file size: ', vAnalysisObj.PageFileSize);
        writeln('Total fragments: ', vAnalysisObj.TotalPageFileFragments);
        writeln;
        writeln('Total folders: ', vAnalysisObj.TotalFolders);
        writeln('Fragmented folders: ', vAnalysisObj.FragmentedFolders);
        writeln('Excess folder fragments: ', vAnalysisObj.ExcessFolderFragments);
        writeln;
        writeln('Total MFT size: ', vAnalysisObj.TotalMFTSize);
        writeln('MFT record count: ', vAnalysisObj.MFTRecordCount);
        writeln('% MFT in use: ', vAnalysisObj.MFTPercentInUse);
        writeln('Total MFT fragments: ', vAnalysisObj.TotalMFTFragments);
      end else
      begin
        writeln(vMethod.LastWmiErrorDescription);
      end;
    end else
    begin
      writeln('Could not find volume ' + volume);
    end;

  finally
    vMethod.Free;
    vQuery.Free;
    vConnection.Free;
  end;

end;