Hej! Hej, Hej! Hej Tommy, tack för din detaljerade bild. Det kanske kan göra att vi hittar en annan ingång.Hämta namn på inloggad användare i windows från en service
Jag vill, som rubriken säger hämta namnet på den inloggade användaren i windows från en service.
När jag forskat runt lite börjar jag förstå att detta inte är så enkelt som det kan verka.
Windows-services verkar köra under nån egen sorts process och med en egen system-användare som inte har något med den "vanliga" användaren att göra.
Nån som har några idéer på hur man kan göra?Sv: Hämta namn på inloggad användare i windows från en service
Intressant fråga. Du kan ju om du kör .net använda objektet user där du kan plocka upp användarnamnet som antingen loggat in på datorn eller loggat in i det aktuella AD:t. Dock som du säger körs ju en windows service av operativsystemet och därmed oberoende vem som är inloggad eller inte. Den kan ju köras även om man inte är inloggad men operativsystemet är igång. Så, jag tror inte du kan lyckas med detta moment såvida inte det går att programmet kan läsa någon logg som kan läsas upp - men tror inte det finns något sådant. Tanken med en service är just - kör oavsett vem som loggat in.
I vanliga fall hade detta fungerat:System.Security.Principal.WindowsIdentity.GetCurrent().Name
Ett annat grepp kan vara att använda WMI som du kan prova innan du letar en annan väg:
using System;
namespace WindowsServiceTest
{
class Program
{
static void Main(string[] args)
{
System.Management.SelectQuery sQuery = new System.Management.SelectQuery(string.Format("select name, startname from Win32_Service")); // where name = '{0}'", "MCShield.exe"));
using (System.Management.ManagementObjectSearcher mgmtSearcher = new System.Management.ManagementObjectSearcher(sQuery))
{
foreach (System.Management.ManagementObject service in mgmtSearcher.Get())
{
string servicelogondetails =
string.Format("Name: {0} , Logon : {1} ", service["Name"].ToString(), service["startname"]).ToString();
Console.WriteLine(servicelogondetails);
}
}
Console.ReadLine();
}
}
}
Kan du berätta lite mer vad du skall försöka uppnå och varför - för att se om det är någon annan infallsvinkel vi kan hjälpa dig med?
Hälsningar
/Pelle
Sv:Hämta namn på inloggad användare i windows från en service
Tack för ditt förslag till lösning. Jag har inte riktigt tid att testa koden nu, men ska göra det så snart som möjligt. Jag lyckades googla fram en lösning som innebar att jag får ut samtliga användare som är inloggad på maskinen. Alltså "vanliga" användarkonton + konton som systemet själv använder. Dock är detta inte någon bra lösning då det blir en lista med ca 8-10 användare. Några användare skrevs även ut som dubletter.
Det jag vill göra är att för en server kolla vilken användare som är inloggad och därefter skicka ett mail med användarnamnet till lämplig person (I detta fallet en av mina arbetskollegor. Trodde som sagt det skulle vara en ganska enkel sak att lösa, men än så länge har jag upplevt det som ganska krångligt=)
Anledningen till att jag vill göra kontrollen är att ett SQL-batchjob körs på denna servern och i samband med detta måste en viss användare vara inloggad i windows samt i en klient-affärssystem-applikation som körs på denna maskinen. Är inte användaren inloggad kommer vissa delar av batchjobbet inte köras korrekt. Här vet jag inte mer då jag inte är ansvarig för de bitarna. Jag har egentligen bara fått frågan om att skapa en sån här automagisk kontroll.
Är tacksam för alla tips jag kan få.
mvh
TommySv: Hämta namn på inloggad användare i windows från en service
Du säger att batch-jobbet bara körs om en viss användare är inne? Det är kanske där du skall lägga kraften istället och se till att batchjobbet fungerar korrekt oavsett vem som loggat in var och när. Kan du berätta lite mer om batch-jobbet? Vad finns det för samband med vilka som är inloggade och vad som skall köras? Batchjobb kan sättas upp via SQL-Server som kör på klocka eller andra förutsättningar.
En annan sak som går att använda är något i .net som heter "file system watcher". Det är ett objekt som kan övervaka en fil eller förändringar i katalog och likanande och när det händer så fångas ett event. En annan sak är att via WM försöka lista de processer som är igång och om ett visst program körs så kan man avläsa det också.
Så, första frågan är att fokusera på "batch-jobbet". Lite mer information om det vore intressant.