0

ここで私がやろうとしているのは、Microsoft Lync が実行されているかどうかを確認するサービスを作成することです。実行中の場合は、イベントログに書き込むだけです。実行されていない場合は、exe を実行してから、Lync にログインします。私が得ている問題は、exeを実行するときが来て、プロセスを開始しますが、実際にアプリを実行することはありません。メモ帳で動作するかどうかを確認しようとしましたが、タスク マネージャーでプロセスを作成するだけで、実際のアプリを開くことはありませんでした。

  Imports System
  Imports System.Data
  Imports System.Timers
  Imports System.Diagnostics
  Imports System.Data.SqlClient
  Imports System.ServiceProcess
  Imports System.Windows.Forms

    Public Class Service1

    Protected Overrides Sub OnStart(ByVal args() As String)
        EventLog.WriteEntry("In Onstart", "starting timer")
           Timer1.Start()
    End Sub



   Protected Overrides Sub OnStop()
   End Sub

   Private Sub Timer1_Elapsed(ByVal sender As System.Object, 
   ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed

       If IsProcessRunning("communicator") Then
       EventLog.WriteEntry("no problem")
       Else
       EventLog.WriteEntry("not running")
       Dim info As New ProcessStartInfo("C:\Program Files (x86)\Microsoft Lync\communicator.exe")
       info.UseShellExecute = False
       info.RedirectStandardError = True
       info.RedirectStandardInput = True
       info.RedirectStandardOutput = True
       info.CreateNoWindow = True
       info.ErrorDialog = False
       info.WindowStyle = ProcessWindowStyle.Hidden

     Dim process__1 As Process = Process.Start(info)

     End If

   End Sub

   Public Function IsProcessRunning(ByVal name As String) As Boolean
      For Each clsProcess As Process In Process.GetProcesses()
        If clsProcess.ProcessName.StartsWith(name) Then
         Return True
      End If
      Next
         Return False
   End Function
End Class
4

2 に答える 2

1

問題は、Windows (および特にバージョン 6.x 以降) では、サービスが完全に分離されたセッションとデスクトップで実行され、ユーザーの操作の可能性がまったくないという事実に起因します。これは設計上、セキュリティ上の理由から推奨されません。起動しているプログラムは実際に起動しますが、ユーザーが表示できない非表示のデスクトップ (メモ帳と同じ) で起動します。

手っ取り早い回避策は、コントロール パネルでサービスを対話型としてマークし、対話型サービス検出サービスを開始することです。その場合、サービスがプログラムを実行すると、タスクバーでウィンドウが点滅し、サービスからのメッセージがあることが通知されるため、その並列デスクトップに切り替えて実際に表示できます。これは単にユーザーにとって非常に不便であり、広くBAD PRACTICEと見なされています。

本当の解決策は、プログラムをサービスではなく通常のアプリケーションにし、すべてのユーザーに対して Windows の自動起動場所から実行することです。UI を表示する必要はありませんが、実行するのと同じコンテキストで実行されます。または、サービスを終了するだけでなく、2 番目のプログラムを実行するためだけに、サービスと通信するアプリケーションをユーザー空間に配置することもできます。いずれにせよ、一般的なルールは、サービス プロセスからのいかなる種類のユーザー操作も行わないことです。

問題といくつかの回避策を説明する記事を次に示しますhttp://blogs.technet.com/b/askperf/archive/2007/04/27/application-compatibility-session-0-isolation.aspx

于 2013-07-20T00:02:50.940 に答える
0

Lync が実行されているかどうかを検出し、実行されていない場合はプログラムを再起動するプログラムを作成できました。

Imports System.Diagnostics
Imports Microsoft.Lync
Imports Microsoft.Lync.Model
Imports Microsoft.Lync.Model.Conversation
Imports Microsoft.Lync.Model.Group

Public Class frmCheckLync
Private _lyncClient As LyncClient
Private _contactManager As ContactManager
Private _conversationManager As ConversationManager
Private _self As Self
Private _groups As Dictionary(Of String, Group)
Private _contactSubscriptions As Dictionary(Of String, ContactSubscription)
Public Event StateChanged As EventHandler(Of ClientStateChangedEventArgs)
Public _signIn As IAsyncResult
Public asyncState As Object() = {_lyncClient}
Public clsProcess As Process


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try

        Timer1.Enabled = True

        AddHandler Timer1.Elapsed, AddressOf Timer1_Tick

        Timer1.Interval = 600

        Timer1.Start()

    Catch ex As Exception

        Diagnostics.EventLog.WriteEntry("This is a test" + ex.Message.ToString, "This is a test")

    End Try
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs)

    Try

        Timer1.Stop()

        GetClient()


        Try
            CheckClient()
        Catch ex As Exception

        End Try



    Catch ex As Exception




    Finally

        Timer1.Start()

    End Try

End Sub

Public Function IsProcessRunning(ByVal name As String) As Boolean
    For Each Me.clsProcess In Process.GetProcesses()

        If Me.clsProcess.ProcessName.StartsWith(name) Then
            Return True
        End If
    Next
    Return False
End Function

Public Sub GetClient()
    If IsProcessRunning("communicator") = False Then

        Try
            Dim info As New ProcessStartInfo("C:\Program Files\Microsoft Lync\communicator.exe")
            info.UseShellExecute = False
            info.RedirectStandardError = True
            info.RedirectStandardInput = True
            info.RedirectStandardOutput = True
            info.CreateNoWindow = True
            info.ErrorDialog = False
            info.WindowStyle = ProcessWindowStyle.Normal

            Dim process__1 As Process = Process.Start(info)
        Catch ex1 As Exception

        End Try
        Try
            Dim info1 As New ProcessStartInfo("C:\Program Files (x86)\Microsoft Lync\communicator.exe")
            info1.UseShellExecute = False
            info1.RedirectStandardError = True
            info1.RedirectStandardInput = True
            info1.RedirectStandardOutput = True
            info1.CreateNoWindow = True
            info1.ErrorDialog = False
            info1.WindowStyle = ProcessWindowStyle.Normal

            Dim process__2 As Process = Process.Start(info1)
        Catch ex2 As Exception

        End Try
    End If
End Sub
Public Sub CheckClient()
    Try
        _lyncClient = LyncClient.GetClient()
    Catch
        GetClient()
    End Try


    If _lyncClient.State = ClientState.SignedOut Then
        _signIn = _lyncClient.BeginSignIn(Nothing, Nothing, Nothing,
                                          Function(result)
                                              If result.IsCompleted Then
                                                  _lyncClient.EndSignIn(result)
                                                  ' Setup application logic

                                                  ' could not sign in 
                                              Else
                                              End If

                                          End Function, TryCast("Local user signing in", Object))

    End If

End Sub



End Class
于 2014-07-25T21:02:58.510 に答える