ASP.NET - удаленный скриншот - PullRequest
0 голосов
/ 19 мая 2010

Я сделал очень простое маленькое приложение, чтобы сделать скриншот рабочего стола и отправить его в общий сетевой ресурс.Примерно на 10 ПК было бы установлено это приложение.

Моя идея состоит в том, что в ASP.NET будет одна панель управления, которая просто показывает эти скриншоты на веб-странице.Пока все просто.Но поскольку я не хочу засорять сеть и отправлять снимок экрана каждые 1 минуту, я хотел бы запустить .exe на удаленном ПК по требованию пользователя ASP.NET.

К сожалению, у меня нетне нашел никакой информации (и я полный ASP.NET n00b), как запустить удаленный исполняемый файл в контексте удаленного ПК (поэтому я не буду видеть скриншоты ASP-сервера :)) Если такой возможности нет,Посоветуйте пожалуйста другой способ решить эту проблему.

Ответы [ 5 ]

2 голосов
/ 19 мая 2010

Обновление после уточнения:

Взгляните на ситуацию под другим углом:

Почему бы вам не запустить веб-сервер на клиентах, которые размещают страницу asp.net, которая запускает захват. Затем вы можете с вашего корневого сервера просто отправлять http-запросы клиентам и получать изображение.

Вы можете попробовать http://CassiniDev.codeplex.com - он поддерживает внешние IP и имена хостов.

И вы также можете рассмотреть возможность встраивания CassiniDev-lib (очень простой пример показан здесь - Использование CassiniDev для размещения ASP.Net в вашем приложении , чтобы вы могли использовать веб-сервер как Получатель и приложение форм могут делать на клиенте все, что захотят.

Я уверен в этом подходе, так как я разработал cassinidev с этим как один из основных вариантов использования.


С asp.net вы не можете. Это только HTML / JavaScript, как только он попадает в браузер.

ActiveX возможен, но он довольно болезненный, устаревший и ограниченный. И больно.

Новый способ сделать что-то подобное - развернуть приложение .net Forms или приложение WPF с помощью Click Once.

Вы также можете написать приложение браузера WPF, но получение необходимых разрешений повлечет за собой настройку полного доверия к сайту.

1 голос
/ 19 мая 2010

Если веб-страница может запустить произвольный .exe-файл на вашем компьютере, это может стать проблемой безопасности.

Однако, поскольку это ваши ПК, вы можете потребовать от них установить какой-либо элемент управления ActiveX, который затем можно будет встроить на страницу ASP.NET.

0 голосов
/ 28 декабря 2010

Я несколько раз проделал это точно для мониторинга систем удаленного отображения. Я обнаружил, что при использовании MiniCap.exe для захвата изображения также снималось видео (что требовалось в удаленных системах отображения). Я также использовал Cassini, как описано в Sky Sanders, с ASPX-страницей со следующим кодом.

Тогда я просто ссылаюсь на страницу из img src = "http://computer/page.aspx?paramters". (дайте мне знать, если вам нужна дополнительная информация)

    <%@ 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()

%>
0 голосов
/ 25 мая 2010

Спасибо всем за ответы, это были интересные подходы к теме.

Тем не менее, из-за многих факторов я получил следующее решение:

  1. Приложение псевдо-службы (Windows Forms с иконкой в ​​трее и скрытой формой) на клиентских ПК. Он служит в качестве TCP-сервера.

  2. Веб-приложение ASP.Net на сервере с функцией клиента TCP.

По запросу веб-пользователя веб-приложение отправляет предварительно отформатированную строку TCP-активации на выбранный ПК. Приложение Tray делает снимок экрана и отправляет его на предварительно заданный общий ресурс SMB, доступный для отображения в веб-приложении.

Еще раз спасибо!

0 голосов
/ 19 мая 2010

Как уже говорили другие, ASP.Net действительно не может вызывать приложения, но обращение потока управления должно работать нормально ...

Полагаю, вы могли бы постоянно запускать приложение grabber на рабочем столе пользователя, но при этом оно должно вызывать веб-службу / файл, обслуживаемый сервером, который содержит инструкцию для этого экземпляра приложения, чтобы получить скриншот .

Что-то вроде ...

Приложение: я должен что-то делать? (GET /workinstruction.aspx)
Сервер: нет. (сервер решает, запрашивать ли работу, и возвращает результат в (workinstruction.aspx)
Приложение: (ждет 1 минуту)
Приложение: Нужно ли что-то делать?
Сервер: да.
Приложение: (делает снимок экрана и отправляет)
Приложение: (ждет 1 минуту)
Приложение: я должен сделать что-нибудь?

и т.д ...

...