diff --git a/ScreenCast.Core/Sockets/CasterSocket.cs b/ScreenCast.Core/Sockets/CasterSocket.cs index 0aef57b2..a3507978 100644 --- a/ScreenCast.Core/Sockets/CasterSocket.cs +++ b/ScreenCast.Core/Sockets/CasterSocket.cs @@ -13,6 +13,7 @@ using System.IO; using System.Net; using Remotely.ScreenCast.Core.Utilities; using Remotely.ScreenCast.Core.Input; +using Remotely.Shared.Win32; namespace Remotely.ScreenCast.Core.Sockets { @@ -112,6 +113,14 @@ namespace Remotely.ScreenCast.Core.Sockets } }); + Connection.On("CtrlAltDel", async (string viewerID) => + { + if (Conductor.Viewers.TryGetValue(viewerID, out var viewer) && viewer.HasControl) + { + await Connection.InvokeAsync("CtrlAltDel"); + } + }); + Connection.On("GetScreenCast", (string viewerID, string requesterName) => { try diff --git a/Server/CurrentVersion.txt b/Server/CurrentVersion.txt index b0296bc1..b4c1e43a 100644 --- a/Server/CurrentVersion.txt +++ b/Server/CurrentVersion.txt @@ -1 +1 @@ -2019.07.03.1652 +2019.07.05.1321 diff --git a/Server/Migrations/20190705195745_Device.AgentVersion.Designer.cs b/Server/Migrations/20190705195745_Device.AgentVersion.Designer.cs new file mode 100644 index 00000000..14bbf48c --- /dev/null +++ b/Server/Migrations/20190705195745_Device.AgentVersion.Designer.cs @@ -0,0 +1,529 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Remotely.Server.Data; + +namespace Remotely.Server.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20190705195745_Device.AgentVersion")] + partial class DeviceAgentVersion + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062"); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Discriminator") + .IsRequired(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex"); + + b.ToTable("RemotelyUsers"); + + b.HasDiscriminator("Discriminator").HasValue("IdentityUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(128); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("Name") + .HasMaxLength(128); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("CommandMode"); + + b.Property("CommandResults"); + + b.Property("CommandText"); + + b.Property("OrganizationID"); + + b.Property("PSCoreResults"); + + b.Property("SenderConnectionID"); + + b.Property("SenderUserID"); + + b.Property("TargetDeviceIDs"); + + b.Property("TimeStamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("CommandContexts"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("AgentVersion"); + + b.Property("CurrentUser"); + + b.Property("DeviceName"); + + b.Property("Drives"); + + b.Property("FreeMemory"); + + b.Property("FreeStorage"); + + b.Property("Is64Bit"); + + b.Property("IsOnline"); + + b.Property("LastOnline"); + + b.Property("OSArchitecture"); + + b.Property("OSDescription"); + + b.Property("OrganizationID"); + + b.Property("Platform"); + + b.Property("ProcessorCount"); + + b.Property("ServerVerificationToken"); + + b.Property("Tags") + .HasMaxLength(200); + + b.Property("TotalMemory"); + + b.Property("TotalStorage"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("Devices"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => + { + b.Property("PermissionGroupID"); + + b.Property("DeviceID"); + + b.HasKey("PermissionGroupID", "DeviceID"); + + b.HasIndex("DeviceID"); + + b.ToTable("DevicePermissionLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("EventType"); + + b.Property("Message"); + + b.Property("OrganizationID"); + + b.Property("Source"); + + b.Property("StackTrace"); + + b.Property("TimeStamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("EventLogs"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("DateSent"); + + b.Property("InvitedUser"); + + b.Property("IsAdmin"); + + b.Property("OrganizationID"); + + b.Property("ResetUrl"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("InviteLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Organization", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("OrganizationName") + .HasMaxLength(25); + + b.HasKey("ID"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .HasMaxLength(100); + + b.Property("OrganizationID"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("PermissionGroups"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd(); + + b.Property("ContentType"); + + b.Property("FileContents"); + + b.Property("FileName"); + + b.Property("OrganizationID"); + + b.Property("Timestamp"); + + b.HasKey("ID"); + + b.HasIndex("OrganizationID"); + + b.ToTable("SharedFiles"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => + { + b.Property("PermissionGroupID"); + + b.Property("RemotelyUserID"); + + b.HasKey("PermissionGroupID", "RemotelyUserID"); + + b.HasIndex("RemotelyUserID"); + + b.ToTable("UserPermissionLinks"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasBaseType("Microsoft.AspNetCore.Identity.IdentityUser"); + + b.Property("IsAdministrator"); + + b.Property("OrganizationID"); + + b.Property("UserOptions"); + + b.HasIndex("OrganizationID"); + + b.ToTable("RemotelyUsers"); + + b.HasDiscriminator().HasValue("RemotelyUser"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.CommandContext", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("CommandContexts") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.Device", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("Devices") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.DevicePermissionLink", b => + { + b.HasOne("Remotely.Shared.Models.Device", "Device") + .WithMany("DevicePermissionLinks") + .HasForeignKey("DeviceID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") + .WithMany("DevicePermissionLinks") + .HasForeignKey("PermissionGroupID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.EventLog", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("EventLogs") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.InviteLink", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("InviteLinks") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.PermissionGroup", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("PermissionGroups") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.SharedFile", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("SharedFiles") + .HasForeignKey("OrganizationID"); + }); + + modelBuilder.Entity("Remotely.Shared.Models.UserPermissionLink", b => + { + b.HasOne("Remotely.Shared.Models.PermissionGroup", "PermissionGroup") + .WithMany("UserPermissionLinks") + .HasForeignKey("PermissionGroupID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Remotely.Shared.Models.RemotelyUser", "RemotelyUser") + .WithMany("UserPermissionLinks") + .HasForeignKey("RemotelyUserID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Remotely.Shared.Models.RemotelyUser", b => + { + b.HasOne("Remotely.Shared.Models.Organization", "Organization") + .WithMany("RemotelyUsers") + .HasForeignKey("OrganizationID"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Server/Migrations/20190705195745_Device.AgentVersion.cs b/Server/Migrations/20190705195745_Device.AgentVersion.cs new file mode 100644 index 00000000..4922aec6 --- /dev/null +++ b/Server/Migrations/20190705195745_Device.AgentVersion.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Remotely.Server.Migrations +{ + public partial class DeviceAgentVersion : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AgentVersion", + table: "Devices", + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AgentVersion", + table: "Devices"); + } + } +} diff --git a/Server/Migrations/ApplicationDbContextModelSnapshot.cs b/Server/Migrations/ApplicationDbContextModelSnapshot.cs index bde9bce4..299c120f 100644 --- a/Server/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Server/Migrations/ApplicationDbContextModelSnapshot.cs @@ -217,6 +217,8 @@ namespace Remotely.Server.Migrations b.Property("ID") .ValueGeneratedOnAdd(); + b.Property("AgentVersion"); + b.Property("CurrentUser"); b.Property("DeviceName"); diff --git a/Server/Pages/Clients.cshtml b/Server/Pages/Clients.cshtml index 77d7a61d..a4f3d0c3 100644 --- a/Server/Pages/Clients.cshtml +++ b/Server/Pages/Clients.cshtml @@ -4,32 +4,6 @@ ViewData["Title"] = "Client Downloads"; } - - - - Please Note: - - - - Install/uninstall scripts require elevated privileges (i.e. "run as admininistrator"). - - - An installation log is created at %temp%\Remotely_Install.txt. - - - Client logs are created at %temp%\Remotely_Logs.txt. - - - For a Windows Service, %temp% is C:\Windows\Temp\. - - - - - - - - - Screen-Sharing Client diff --git a/Server/Pages/RemoteControl.cshtml b/Server/Pages/RemoteControl.cshtml index 99f296b7..69a6eca4 100644 --- a/Server/Pages/RemoteControl.cshtml +++ b/Server/Pages/RemoteControl.cshtml @@ -128,7 +128,7 @@ -
- Please Note: -