"Dim recv As Integer = sock.ReceiveFrom(data, ep)"
the service will fail starting with error code 3534 (the service
reported no errors). Neither are errors written to the event log.
If I run the same code from a console application, everything works
fine.
The code:
Protected Overloads Overrides Sub OnStart(args As String())
Dim iep As New IPEndPoint(IPAddress.Any, 9050)
sock.Bind(iep)
Dim ep As EndPoint = DirectCast(iep, EndPoint)
Dim data As Byte() = New Byte(1024) {}
Dim recv As Integer = sock.ReceiveFrom(data, ep)
Dim stringData As String = Encoding.ASCII.GetString(data, 0, recv)
data = New Byte(1024) {}
End Sub
Any ideas why that particular line prevents service from starting?
Regards
Morten Snedker
Here is some crappy code to figure it out, its C# but the translation should
be simple.
private string FindIIdentity()
{
try
{
//'Dim user As WindowsPrincipal =
CType(System.Threading.Thread.CurrentPrincipal, WindowsPrincipal)
//'Dim ident As IIdentity = user.Identity
string returnValue = string.Empty;
WindowsIdentity ident = WindowsIdentity.GetCurrent();
returnValue = ident.Name;
try
{
returnValue += " on " + System.Environment.MachineName;
}
catch (Exception ex)
{
Conditionals.Trace.WriteMessage(ex.Message);
}
return returnValue;
}
catch (Exception ex)
{
Conditionals.Trace.WriteMessage(ex.Message);
return "Error Finding Identity";
}
}
"Snedker" <morten....@gmail.com> wrote in message
news:008b3f91-9105-41f2...@w6g2000yqw.googlegroups.com...
The console app is run with my login account (K1\Snedker).
The service is run with the built-in SYSTEM-account.
This short piece of code makes the service fail starting, as well:
Protected Overloads Overrides Sub OnStart(args As String())
Dim ident As WindowsIdentity = WindowsIdentity.GetCurrent()
Dim s As String = ident.Name
Dim sr As New StreamWriter("e:\tmp.txt")
End Sub
Out-commenting the StreamWriter line will make it work.
So what I suppose you're getting at, is that the SYSTEM account may
lack the necessary credentials? If so, how ought I to get around it?
Thanks for your time and effort!
Regards /Snedker
There ya go.
Provide the account with the necessary permissions.
"Snedker" <morten....@gmail.com> wrote in message
news:5cfd8751-2aba-490f...@g31g2000yqc.googlegroups.com...
The problem persists even when service is run with administrative
rights...? I feel like i'm on a wild goose chase here.
/Snedker
Below is sample code.
Create a directory called
C:\WUTEMP\
Give read/write rights to SYSTEM account.
Change your code to the below:
Try '' <<NEW CODE
Dim iep As New IPEndPoint(IPAddress.Any, 9050)
sock.Bind(iep)
Dim ep As EndPoint = DirectCast(iep, EndPoint)
Dim data As Byte() = New Byte(1024) {}
Dim recv As Integer = sock.ReceiveFrom(data, ep)
Dim stringData As String = Encoding.ASCII.GetString(data, 0, recv)
data = New Byte(1024) {}
Catch ex as Exception '' <<NEW CODE
''Hey, something bad happened, lets log it. '' <<NEW CODE
LogException(ex) '' <<NEW CODE
End Try '' <<NEW CODE
Private Sub LogException(ex As Exception)
Dim popTextFile As Boolean = True ''read this value from app.config in
the future maybe(??)
Dim generateLogFile As Boolean = True''read this value from app.config in
the future maybe(??)
Dim longExceptionMessage As String = String.Empty
Dim nestedEx As Exception = ex
While Not (nestedEx Is Nothing)
longExceptionMessage += " ::: " + ex.Message + " :: " + ex.StackTrace
nestedEx = nestedEx.InnerException
End While
If popTextFile Or generateLogFile Then
Dim fileName As String = WriteToTempFile(String.Empty,
longExceptionMessage)
If popTextFile Then
System.Diagnostics.Process.Start(fileName)
Else
Console.WriteLine(fileName)
End If
End If
End Sub 'LogException
Private Function WriteToTempFile(prefix As String, toWrite As String) As
String
' string fileName = System.IO.Path.GetTempFileName();
' fileName = fileName.Replace(".tmp", ".txt");
Dim fileName As String = "C:\WUTEMP\" + Guid.NewGuid().ToString("N") +
".txt" '' give it a guaranteed unique name
Return WriteAFile(fileName, prefix, toWrite)
End Function 'WriteToTempFile
Private Function WriteAFile(fileName As String, prefix As String, toWrite As
String) As String
Dim writer As System.IO.StreamWriter = Nothing
Dim fs As System.IO.FileStream = Nothing
Try
fs = New System.IO.FileStream(fileName, System.IO.FileMode.Append,
System.IO.FileAccess.Write)
' Opens stream and begins writing
writer = New System.IO.StreamWriter(fs)
writer.BaseStream.Seek(0, System.IO.SeekOrigin.End)
writer.WriteLine(toWrite)
writer.Flush()
Return fileName
Finally
If Nothing <> writer Then
writer.Close()
End If
If Nothing <> fs Then
fs.Close()
End If
End Try
End Function 'WriteAFile
"Snedker" <morten....@gmail.com> wrote in message
news:b5172cd8-7b95-4237...@o6g2000yqj.googlegroups.com...
"Snedker" <morten....@gmail.com> wrote in message
news:008b3f91-9105-41f2...@w6g2000yqw.googlegroups.com...
You should not be doing any work in your OnStart event. The OnStart
event should normally kick off a thread to do the actual work and then
quit. Otherwise, the Service Control Manager will throw an error
because the OnStart method did not return in a timely manner.
Chris
Well, there was a 24-hour time span between the postings, and being
near deadline I was getting a bit frustrated. But your point is noted.
/Snedker
That was exactly it. Thanks!
/Snedker