2010-05-19 3 views
0

J'ai fait une petite application très très simple pour prendre une capture d'écran du bureau et l'envoyer au partage réseau. Environ 10 PC aurait cette application installée.ASP.NET - capture d'écran à distance

Mon idée est, qu'il y aura un tableau de bord dans ASP.NET, qui montre simplement ces captures d'écran sur la page Web. Jusqu'à présent, des choses faciles. Mais, parce que je ne veux pas obstruer le réseau et envoyer la capture d'écran toutes les minutes, je voudrais lancer le fichier .exe sur le PC distant par la demande de l'utilisateur ASP.NET.

Malheureusement, je n'ai pas trouvé d'informations (et je suis un complet ASP.NET n00b), comment lancer l'exécutable à distance dans le contexte du PC distant (donc je ne vais pas voir les captures d'écran du serveur ASP :) S'il n'y a pas une telle possibilité, s'il vous plaît aviser d'une autre façon de résoudre ce problème.

Répondre

0

Merci à tous pour répondre, ce étaient des approches intéressantes au? sujette ct.

Cependant, en raison de nombreux facteurs, je fini avec solution suivante:

  1. Pseudo-service (Windows Forms avec l'icône de la barre et la forme cachée) application sur PC client. Il sert de serveur TCP.

  2. Application Web ASP.Net sur le serveur, avec fonction client TCP.

À la demande de l'utilisateur Web, l'application Web envoie une chaîne TCP 'activation' préformatée au PC choisi. L'application Tray fait une capture d'écran et l'envoie au partage SMB prédéfini, disponible pour l'application Web à afficher.

Merci encore!

2

Mise à jour après clarification:

Jetez un oeil à la situation sous un autre angle:

Pourquoi ne pas vous exécutez un serveur Web sur les clients qui hébergent une page asp.net qui déclenche la Capturer. Ensuite, vous pouvez, depuis votre serveur racine, simplement envoyer des requêtes http aux clients et récupérer l'image.

Vous pouvez essayer http://CassiniDev.codeplex.com - il prend en charge les adresses IP externes et les noms d'hôte. Et vous pouvez également envisager d'intégrer simplement le CassiniDev-lib (un exemple très simple est montré ici - Using CassiniDev to host ASP.Net in your application, de cette façon vous pouvez utiliser le serveur web comme receveur et l'application formulaires peut faire ce qu'il veut sur le client.

Je suis confiant dans cette approche que j'ai conçu cassinidev avec ce que l'un des principaux cas d'utilisation.


de asp.net vous ne pouvez pas. il est seulement HTML/JavaScript une fois qu'il est dans le navigateur

ActiveX est une possibilité mais c'est assez douloureux et daté et limité. Et douloureux.

La nouvelle façon de procéder consiste à déployer une application .net Forms ou une application WPF via Click Once.

Vous pouvez également écrire une application de navigateur WPF mais obtenir le type d'autorisations dont vous auriez besoin impliquerait de définir le site comme une confiance totale.

+0

vous avez oublié painfull;) – TomTom

+0

Je pense que nous avons mal compris. Le serveur ASP se trouve sur le même réseau que les PC «en capture d'écran». Peut-être que la connexion TCP entre le serveur ASP et le service s'exécutant sur ces PC? Envoi d'un commutateur, et le service rendrait la capture d'écran et l'envoyer à partager des fenêtres prédéfinies? – ufoq

+0

Ok, bien c'est une question entièrement différente. Je vais proposer une autre solution. –

1

Si une page Web pouvait lancer un fichier .exe arbitraire sur votre ordinateur, ce serait un désastre de sécurité. Cependant, puisque ce sont vos PC, vous pouvez leur demander d'installer un contrôle ActiveX de quelque sorte que vous pourriez ensuite incorporer dans votre page ASP.NET.

+0

ouais. drôle combien de gens ne pensent jamais une seconde à propos de waht qu'ils demandent vraiment (ici: la page html aléatoire commence le programme aléatoire sur l'ordinateur local sans interaction de l'utilisateur - pensez à ce que cela peut signifier si maltraités par les mauvaises personnes). – TomTom

0

Comme d'autres l'ont dit, il n'y a vraiment aucun moyen pour ASP.Net pour appeler aux applications, mais inverser le flux de contrôle devrait fonctionner OK ...

Je suppose que vous pourriez avoir l'application de cartes d'acquisition en cours d'exécution tout l'heure sur le bureau des utilisateurs, mais appelez-le vers un service Web/fichier servi par le serveur contenant une instruction pour cette instance de l'application afin de récupérer une capture d'écran.

Quelque chose comme ...

App: Dois-je faire quelque chose? (GET /workinstruction.aspx)
Serveur: non. (Serveur décide de demander des travaux, et retourner le résultat dans (workinstruction.aspx)
App: (attend 1 minute)
App: Est-ce que je dois faire quoi que ce soit
serveur:. Oui
App: (prend capture d'écran et présente)
App: (attend 1 minute)
App: Est-ce que je dois faire quoi que ce soit

etc ...

0

J'ai fait cette chose exacte quelques fois pour surveiller les systèmes d'affichage à distance. Ce que j'ai trouvé était que l'utilisation de MiniCap.exe pour capturer l'image a également pris de la vidéo (ce qui était nécessaire sur les systèmes d'affichage à distance). J'ai également utilisé Cassini comme décrit par Sky Sanders avec une page ASPX avec le code suivant.

Ensuite, je viens de faire référence à la page à partir d'un img src = "http: //computer/page.aspx? Paramtres". (Faites-moi savoir si vous avez besoin de plus d'informations)

<%@ Import NameSpace="System.IO" %> 
    <%@ Import NameSpace="System.Drawing" %> 
    <%@ Import NameSpace="System.Drawing.Imaging" %> 
    <%@ Import NameSpace="System.Diagnostics" %> 
    <% 

    Response.Buffer = True 
    Response.BufferOutput = True 

    Dim CompressionLevel As Integer = 1 
    Dim compress As Integer = 1 
    If Not Request.Item("compress") Is Nothing Then 
     If IsNumeric(Request.Item("compress")) = True Then 
      CompressionLevel = CInt(Request.Item("compress")) 
     End If 
    End If 
    compress = CompressionLevel 

    ' Resize requested? 
    Dim SizeX As Integer = 100 
    Dim SizeY As Integer = 75 
    If Not Request.Item("width") Is Nothing Then 
     If IsNumeric(Request.Item("width")) = True Then 
      SizeX = CInt(Request.Item("width")) 
      CompressionLevel = 10 
     End If 
    End If 
    If Not Request.Item("height") Is Nothing Then 
     If IsNumeric(Request.Item("height")) = True Then 
      SizeY = CInt(Request.Item("height")) 
      CompressionLevel = 10 
     End If 
    End If 

    Dim Region As String = "" 
    If Not Request.Item("region") Is Nothing Then 
     Region = Request.Item("region") 
    End If 
    Dim XS As Integer = 0 
    Dim YS As Integer = 0 
    Dim XE As Integer = 1023 
    Dim YE As Integer = 766 

    Try 
     If Region.IndexOf(",") > -1 Then 
      Dim Rec() As String = Region.Split(",") 
      If Rec.GetUpperBound(0) >= 3 Then 
       If IsNumeric(Rec(0)) Then XS = Rec(0) 
       If IsNumeric(Rec(1)) Then YS = Rec(1) 
       If IsNumeric(Rec(2)) Then XE = Rec(2) 
       If IsNumeric(Rec(3)) Then YE = Rec(3) 
      End If 

     End If 
    Catch : End Try 



    Dim FileType As String = "jpg" 
    Dim MimeType As String = "jpeg" 
    If Not Request.Item("filetype") Is Nothing Then 
     FileType = Request.Item("filetype") 
     MimeType = FileType 
    End If 
    If Not Request.Item("mimetype") Is Nothing Then 
     FileType = Request.Item("mimetype") 
    End If 



    Dim ImageFile As String = "" 
    Dim ImageThumbFile As String = "" 
    Dim ImageFolder As String = Server.MapPath("~/ScreenShots/") 

    If IO.Directory.Exists(ImageFolder) = False Then 
     IO.Directory.CreateDirectory(ImageFolder) 
    End If 

    ' Delete files older than 30 minutes 
    For Each File As String In IO.Directory.GetFiles(ImageFolder) 
     Response.Write("File: " & File & "<br>") 
     If IO.File.GetCreationTimeUtc(File).AddMinutes(30) < Now.ToUniversalTime Then 
      IO.File.Delete(File) 
     End If 
    Next 

    ' Find available filename 
    Dim tmpC As Integer = 0 
    While tmpC < 100 
     tmpC += 1 

     ImageFile = "ScreenShot_" & CStr(tmpC).PadLeft(5, "0") & "." & FileType 
     ImageThumbFile = "ScreenShot_" & CStr(tmpC).PadLeft(5, "0") & "_thumb." & FileType 

     If IO.File.Exists(ImageFolder & "\" & ImageFile) = False Then 
      ' Found our filename 
      ' Reserve it 
      Dim ios As IO.FileStream = IO.File.Create(ImageFolder & "\" & ImageFile) 
      ios.Close() 
      ios = Nothing 
      Exit While 
     End If 
    End While 

    ' Run MiniCap 

    '   " -capturedesktop" & _ 
Dim CMD As String = """" & Server.MapPath("/MiniCap.EXE") & """" & _ 
     " -save """ & ImageFolder & "\" & ImageFile & """" & _ 
     " -captureregion " & XS & " " & YS & " " & XE & " " & YE & _ 
     " -exit" & _ 
     " -compress " & CompressionLevel 

    If Not CMD Is Nothing Then 

     Dim myProcess As Process = New Process 
     Dim RouteFB As String 
     With myProcess 
      With .StartInfo 
       .FileName = "cmd.exe" 
       .UseShellExecute = False 
       .CreateNoWindow = True 
       .RedirectStandardInput = True 
       .RedirectStandardOutput = True 
       .RedirectStandardError = True 
      End With 
      .Start() 
     End With 

     Dim sIn As IO.StreamWriter = myProcess.StandardInput 
     sIn.AutoFlush = True 

     ' Create stream reader/writer references 
     Dim sOut As IO.StreamReader = myProcess.StandardOutput 
     Dim sErr As IO.StreamReader = myProcess.StandardError 

     ' Send commands 
     sIn.Write(CMD & System.Environment.NewLine) 
     sIn.Write("exit" & System.Environment.NewLine) 

     ' Wait one second 
     'Threading.Thread.CurrentThread.Sleep(60000) 

     ' Read all data 
     Response.Write(sOut.ReadToEnd) 

     ' Kill process if still running 
     If Not myProcess.HasExited Then 
      myProcess.Kill() 
     End If 

     sIn.Close() 
     sOut.Close() 
     sErr.Close() 
     myProcess.Close() 
    End If 


    Response.Clear() 
    Response.ClearContent() 



    If Not Request.Item("width") Is Nothing Or Not Request.Item("length") Is Nothing Then 
     ' Resize, making thumbnail in desired size 
     Dim b As Bitmap = Bitmap.FromFile(ImageFolder & "\" & ImageFile) 
     Dim thumb As Bitmap = b.GetThumbnailImage(SizeX, SizeY, Nothing, IntPtr.Zero) 

     ' Jpeg image codec 
     Dim jpegCodec As ImageCodecInfo 
     ' Get image codecs for all image formats 
     Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders() 
     ' Find the correct image codec 
     For i As Integer = 0 To codecs.Length - 1 
      If (codecs(i).MimeType = "image/" & MimeType) Then 
       jpegCodec = codecs(i) 
       Exit For 
      End If 
     Next i 
     Dim qualityParam As New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compress * 10) 
     Dim encoderParams As New EncoderParameters(1) 
     encoderParams.Param(0) = qualityParam 

     thumb.Save(ImageFolder & "\" & ImageThumbFile, jpegCodec, encoderParams) 
     thumb.Dispose() 
     b.Dispose() 
     ' Send thumb 
     Response.TransmitFile(ImageFolder & "\" & ImageThumbFile) 
    Else 
     ' Send normal file 
     Response.TransmitFile(ImageFolder & "\" & ImageFile) 
    End If 


    Response.End() 

%>