'===========================================================================
' Subject: NETWORK INFO UTILITY               Date: 06-29-98 (16:58)       
'  Author: Dave Navarro, Jr.                  Code: PBCC                   
'  Origin: dave@powerbasic.com              Packet: PBCC.ABC
'===========================================================================
'==============================================================================
'
'  Network Info Utility for PB/CC 1.0
'  Copyright (c) 1998 by PowerBASIC, Inc.
'
'  Returns information about the current logged in user.
'
'  IMPORTANT:  This program only works in Windows NT!  The network API calls
'              used are not present in Windows 95 or 98.
'
'==============================================================================

$DIM ALL
$INCLUDE "WIN32API.INC"

'==============================================================================

FUNCTION WinErrMessage(BYVAL x AS LONG) AS STRING

  LOCAL buffer AS ASCIIZ * 64

  FormatMessage %FORMAT_MESSAGE_FROM_SYSTEM, BYVAL %NULL, x, %NULL, buffer,
SIZEOF(buffer), BYVAL %NULL

  IF LEN(buffer) THEN
    FUNCTION = buffer
  ELSE
    FUNCTION = FORMAT$(x)
  END IF

END FUNCTION

FUNCTION StrToAnsi(BYVAL u AS LONG) AS STRING

  DIM Buffer AS STRING
  DIM x      AS STRING
  DIM l      AS LONG

  l = lstrlenW(BYVAL u)
  x = PEEK$(u, l * 2)

  Buffer = SPACE$(LEN(x) \ 2)

  WideCharToMultiByte %CP_ACP, _               ' code page
                      %NULL, _                 ' performance and mapping flags
                      BYVAL STRPTR(x), _       ' Unicode string to convert
                      LEN(x), _                ' len of Unicode string
                      BYVAL STRPTR(Buffer), _  ' buffer for ANSI string
                      LEN(Buffer), _           ' len of ANSI buffer
                      BYVAL %NULL, _           ' default for unmappable chars
                      BYVAL %NULL              ' default flag

  IF LEN(Buffer) = 0 THEN
    Buffer = "[none]"
  END IF

  FUNCTION = RTRIM$(Buffer)

END FUNCTION

FUNCTION StrToUnicode(BYVAL x AS STRING) AS STRING

  DIM Buffer AS STRING

  Buffer = SPACE$(LEN(x) * 2)

  MultiByteToWideChar %CP_ACP, _               ' code page
                      %NULL, _                 ' performance and mapping flags
                      BYVAL STRPTR(x), _       ' ANSI string to convert
                      LEN(x), _                ' len of ANSI string
                      BYVAL STRPTR(Buffer), _  ' buffer for Unicode string
                      LEN(Buffer)              ' len of Unicode buffer

  FUNCTION = Buffer

END FUNCTION

'==============================================================================

FUNCTION WinMain (BYVAL CurInst&, _
                  BYVAL PrvInst&, _
                  CmdLine AS ASCIIZ PTR, _
                  BYVAL CmdShow&) EXPORT AS LONG

  LOCAL u        AS ASCIIZ * 256
  LOCAL ni       AS USER_INFO_3 PTR
  LOCAL si       AS SERVER_INFO_102 PTR
  LOCAL wkui     AS WKSTA_USER_INFO_1 PTR
  LOCAL nRet     AS LONG
  LOCAL uW       AS ASCIIZ * 512
  LOCAL tmp      AS STRING

  GetUserName u, 256

  STDOUT "Network information for user " & CHR$(34) & u & CHR$(34)
  STDOUT "Copyright (c) 1998 by PowerBASIC, Inc."
  STDOUT ""

  nRet = NetWkstaUserGetInfo(BYVAL %NULL, 1, wkui)
  IF nRet THEN
    STDOUT "Error: " & WinErrMessage$(nRet)
    EXIT FUNCTION
  END IF

  STDOUT "  Logon Domain: " & StrToAnsi(@wkui.wkui_logon_domain)
  STDOUT "  Logon Server: \\" & StrToAnsi(@wkui.wkui_logon_server)

  nRet = NetWkstaGetInfo(BYVAL %NULL, 102, si)
  IF nRet THEN
    STDOUT ""
    STDOUT "Error: " & WinErrMessage$(nRet)
    EXIT FUNCTION
  END IF

  STDOUT "   System name: \\" & StrToAnsi(@si.sv_name)
  STDOUT "        Hidden: ";

  IF @si.sv_hidden = %SV_HIDDEN THEN
    STDOUT "Yes"
  ELSE
    STDOUT "No"
  END IF

  STDOUT "       Comment: " & StrToAnsi(@si.sv_comment)

  IF @si.sv_type THEN
    STDOUT "         Type: ";
    IF BIT(@si.sv_type, 1) THEN
      STDOUT "Workstation"
    ELSEIF BIT(@si.sv_type, 2) THEN
      STDOUT "Server"
    ELSEIF BIT(@si.sv_type, 3) THEN
      STDOUT "SQL Server"
    ELSEIF BIT(@si.sv_type, 4) THEN
      STDOUT "Primary Domain Controller (PDC)"
    ELSEIF BIT(@si.sv_type, 5) THEN
      STDOUT "Backup Domain Controller (BDC)"
    ELSEIF BIT(@si.sv_type, 6) THEN

      STDOUT "Time Server"
    ELSEIF BIT(@si.sv_type, 7) THEN
      STDOUT "Apple File Protocol Server"
    ELSEIF BIT(@si.sv_type, 8) THEN
      STDOUT "Novell Server"
    ELSEIF BIT(@si.sv_type, 9) THEN
      STDOUT "Domain Member"
    ELSEIF BIT(@si.sv_type, 15) THEN
      STDOUT "Windows NT"
    END IF
  END IF

  uW = StrToUnicode(u)
  nRet = NetUserGetInfo(BYVAL %NULL, uW, 3, ni)
  IF nRet THEN
    STDOUT ""
    STDOUT "Error: " & WinErrMessage$(nRet)
    EXIT FUNCTION
  END IF

  STDOUT ""
  STDOUT "  Account name: " & StrToAnsi(@ni.uName)
  STDOUT "     Full name: " & StrToAnsi(@ni.FullName)
  STDOUT "       Comment: " & StrToAnsi(@ni.Comment)

  SELECT CASE @ni.Privilege
    CASE %USER_PRIV_GUEST : tmp = "Guest"
    CASE %USER_PRIV_USER  : tmp = "User"
    CASE %USER_PRIV_ADMIN : tmp = "Administrator"
    CASE ELSE             : tmp = "Unknown"
  END SELECT

  STDOUT "     Privilege: " & tmp
  STDOUT "Home directory: " & StrToAnsi(@ni.HomeDir)
  STDOUT "   Script Path: " & StrToAnsi(@ni.ScriptPath)
  STDOUT "       Profile: " & StrToAnsi(@ni.Profile)

  NetApiBufferFree ni
  NetApiBufferFree si
  NetApiBufferFree wkui

END FUNCTION
