private async Task <IRemoteDesktopSession> Connect(
            RdpTunnel tunnel,
            InstanceLocator vmInstanceReference)
        {
            using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
            {
                var credentials = await gceAdapter.ResetWindowsUserAsync(
                    vmInstanceReference,
                    CreateRandomUsername(),
                    CancellationToken.None);

                var rdpService = new RemoteDesktopService(this.serviceProvider);
                return(rdpService.Connect(
                           vmInstanceReference,
                           "localhost",
                           (ushort)tunnel.LocalPort,
                           new VmInstanceConnectionSettings()
                {
                    Username = credentials.UserName,
                    Password = credentials.SecurePassword,
                    AuthenticationLevel = RdpAuthenticationLevel.NoServerAuthentication,
                    BitmapPersistence = RdpBitmapPersistence.Disabled,
                    DesktopSize = RdpDesktopSize.ClientSize
                }));
            }
        }
Example #2
0
        private async Task <IRemoteDesktopSession> Connect(
            RdpTunnel tunnel,
            InstanceLocator vmInstanceReference)
        {
            using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
            {
                var credentials = await gceAdapter.ResetWindowsUserAsync(
                    vmInstanceReference,
                    CreateRandomUsername(),
                    TimeSpan.FromSeconds(60),
                    CancellationToken.None);

                var settings = VmInstanceConnectionSettings.CreateNew(vmInstanceReference);
                settings.Username.Value            = credentials.UserName;
                settings.Password.Value            = credentials.SecurePassword;
                settings.AuthenticationLevel.Value = RdpAuthenticationLevel.NoServerAuthentication;
                settings.BitmapPersistence.Value   = RdpBitmapPersistence.Disabled;
                settings.DesktopSize.Value         = RdpDesktopSize.ClientSize;

                var rdpService = new RemoteDesktopConnectionBroker(this.serviceProvider);
                return(rdpService.Connect(
                           vmInstanceReference,
                           "localhost",
                           (ushort)tunnel.LocalPort,
                           settings));
            }
        }
        public async Task WhenCredentialsValid_ThenConnectingSucceeds(
            [Values(RdpConnectionBarState.AutoHide, RdpConnectionBarState.Off, RdpConnectionBarState.Pinned)]
            RdpConnectionBarState connectionBarState,

            [Values(RdpDesktopSize.ClientSize, RdpDesktopSize.ScreenSize)]
            RdpDesktopSize desktopSize,

            [Values(RdpAudioMode.DoNotPlay, RdpAudioMode.PlayLocally, RdpAudioMode.PlayOnServer)]
            RdpAudioMode audioMode,

            [Values(RdpRedirectClipboard.Disabled, RdpRedirectClipboard.Enabled)]
            RdpRedirectClipboard redirectClipboard,

            // Use a slightly larger machine type as all this RDP'ing consumes a fair
            // amount of memory.
            [WindowsInstance(MachineType = "n1-standard-2")] InstanceRequest testInstance)
        {
            await testInstance.AwaitReady();

            using (var tunnel = RdpTunnel.Create(testInstance.InstanceReference))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationService>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        testInstance.InstanceReference,
                        "test",
                        CancellationToken.None);

                    var rdpService = new RemoteDesktopService(this.serviceProvider);
                    var session    = rdpService.Connect(
                        testInstance.InstanceReference,
                        "localhost",
                        (ushort)tunnel.LocalPort,
                        new VmInstanceSettings()
                    {
                        Username            = credentials.UserName,
                        Password            = credentials.SecurePassword,
                        ConnectionBar       = connectionBarState,
                        DesktopSize         = desktopSize,
                        AudioMode           = audioMode,
                        RedirectClipboard   = redirectClipboard,
                        AuthenticationLevel = RdpAuthenticationLevel.NoServerAuthentication,
                        BitmapPersistence   = RdpBitmapPersistence.Disabled
                    });

                    AwaitEvent <RemoteDesktopConnectionSuceededEvent>();
                    Assert.IsNull(this.ExceptionShown);


                    RemoteDesktopWindowClosedEvent expectedEvent = null;

                    this.serviceProvider.GetService <IEventService>()
                    .BindHandler <RemoteDesktopWindowClosedEvent>(e =>
                    {
                        expectedEvent = e;
                    });
                    session.Close();

                    Assert.IsNotNull(expectedEvent);
                }
        }
        public async Task WhenConnected_ThenActiveSessionIsSetAndTryActivateReturnsTrue(
            [WindowsInstance(MachineType = MachineTypeForRdp)] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            using (var tunnel = RdpTunnel.Create(
                       locator,
                       await credential))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        locator,
                        CreateRandomUsername(),
                        TimeSpan.FromSeconds(60),
                        CancellationToken.None);

                    var settings = VmInstanceConnectionSettings.CreateNew(
                        locator.ProjectId,
                        locator.Name);
                    settings.Username.StringValue = credentials.UserName;
                    settings.Password.Value       = credentials.SecurePassword;

                    var broker  = new RemoteDesktopConnectionBroker(this.serviceProvider);
                    var session = broker.Connect(
                        locator,
                        "localhost",
                        (ushort)tunnel.LocalPort,
                        settings);

                    AwaitEvent <ConnectionSuceededEvent>();
                    Assert.IsNull(this.ExceptionShown);

                    Assert.IsTrue(broker.IsConnected(locator));
                    Assert.AreSame(session, broker.ActiveSession);
                    Assert.IsTrue(broker.TryActivate(locator));

                    Assert.IsFalse(broker.TryActivate(SampleLocator));
                    Assert.IsFalse(broker.IsConnected(SampleLocator));

                    ConnectionClosedEvent expectedEvent = null;

                    this.serviceProvider.GetService <IEventService>()
                    .BindHandler <ConnectionClosedEvent>(e =>
                    {
                        expectedEvent = e;
                    });
                    session.Close();

                    Assert.IsNotNull(expectedEvent);
                }
        }
        public async Task WhenInstanceHasServiceAccountAndUserInInstanceAdminRole_ThenResetWindowsUserAsyncThrowsPasswordResetException(
            [WindowsInstance(ServiceAccount = InstanceServiceAccount.ComputeDefault)] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.ComputeInstanceAdminV1)] ResourceTask <ICredential> credential)
        {
            var locator  = await testInstance;
            var adapter  = new ComputeEngineAdapter(await credential);
            var username = "******" + Guid.NewGuid().ToString();

            AssertEx.ThrowsAggregateException <PasswordResetException>(
                () => adapter.ResetWindowsUserAsync(
                    locator,
                    username,
                    CancellationToken.None).Wait());
        }
        public async Task WhenInstanceHasNoServiceAccountAndUserInInstanceAdminRole_ThenResetWindowsUserAsyncSucceeds(
            [WindowsInstance(ServiceAccount = InstanceServiceAccount.None)] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.ComputeInstanceAdminV1)] ResourceTask <ICredential> credential)
        {
            var adapter  = new ComputeEngineAdapter(await credential);
            var username = "******" + Guid.NewGuid().ToString().Substring(20);

            var result = await adapter.ResetWindowsUserAsync(
                await testInstance,
                username,
                CancellationToken.None);

            Assert.IsNotNull(result.Password);
        }
        public async Task WhenSigningOutPerSendKeys_ThenWindowIsClosed(
            [WindowsInstance(ImageFamily = WindowsInstanceAttribute.WindowsServer2019)]
            ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            using (var tunnel = RdpTunnel.Create(
                       locator,
                       await credential))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        locator,
                        CreateRandomUsername(),
                        TimeSpan.FromSeconds(60),
                        CancellationToken.None);

                    var settings = VmInstanceConnectionSettings.CreateNew(
                        locator.ProjectId,
                        locator.Name);
                    settings.Username.StringValue          = credentials.UserName;
                    settings.Password.Value                = credentials.SecurePassword;
                    settings.AuthenticationLevel.EnumValue = RdpAuthenticationLevel.NoServerAuthentication;
                    settings.BitmapPersistence.EnumValue   = RdpBitmapPersistence.Disabled;
                    settings.DesktopSize.EnumValue         = RdpDesktopSize.ClientSize;

                    var rdpService = new RemoteDesktopConnectionBroker(this.serviceProvider);
                    var session    = (RemoteDesktopPane)rdpService.Connect(
                        locator,
                        "localhost",
                        (ushort)tunnel.LocalPort,
                        settings);

                    AwaitEvent <ConnectionSuceededEvent>();

                    Thread.Sleep(5000);
                    session.ShowSecurityScreen();
                    Thread.Sleep(1000);
                    session.SendKeys(Keys.Menu, Keys.S); // Sign out.

                    AwaitEvent <ConnectionClosedEvent>();
                    Assert.IsNull(this.ExceptionShown);
                }
        }
Example #8
0
        public async Task WhenConnected_ThenGetActivePaneReturnsPane(
            [WindowsInstance(MachineType = MachineTypeForRdp)] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            using (var tunnel = IapTunnel.ForRdp(
                       locator,
                       await credential))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        locator,
                        CreateRandomUsername(),
                        TimeSpan.FromSeconds(60),
                        CancellationToken.None);

                    var settings = InstanceConnectionSettings.CreateNew(
                        locator.ProjectId,
                        locator.Name);
                    settings.RdpUsername.StringValue = credentials.UserName;
                    settings.RdpPassword.Value       = credentials.SecurePassword;

                    // Connect
                    var broker = new RemoteDesktopSessionBroker(this.serviceProvider);
                    IRemoteDesktopSession session = null;
                    AssertRaisesEvent <SessionStartedEvent>(
                        () => session = (RemoteDesktopPane)broker.Connect(
                            locator,
                            "localhost",
                            (ushort)tunnel.LocalPort,
                            settings));

                    Assert.IsNull(this.ExceptionShown);

                    Assert.AreSame(session, RemoteDesktopPane.TryGetActivePane(this.mainForm));
                    Assert.AreSame(session, RemoteDesktopPane.TryGetExistingPane(this.mainForm, locator));
                    Assert.IsTrue(broker.IsConnected(locator));
                    Assert.IsTrue(broker.TryActivate(locator));

                    AssertRaisesEvent <SessionEndedEvent>(
                        () => session.Close());
                }
        }
        public async Task WhenSigningOutPerSendKeys_ThenWindowIsClosed(
            [WindowsInstance(ImageFamily = WindowsInstanceAttribute.WindowsServer2019)]
            InstanceRequest testInstance,
            [Credential] CredentialRequest credential)
        {
            await testInstance.AwaitReady();

            using (var tunnel = RdpTunnel.Create(
                       testInstance.Locator,
                       await credential.GetCredentialAsync()))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        testInstance.Locator,
                        CreateRandomUsername(),
                        CancellationToken.None);

                    var rdpService = new RemoteDesktopService(this.serviceProvider);
                    var session    = (RemoteDesktopPane)rdpService.Connect(
                        testInstance.Locator,
                        "localhost",
                        (ushort)tunnel.LocalPort,
                        new VmInstanceConnectionSettings()
                    {
                        Username            = credentials.UserName,
                        Password            = credentials.SecurePassword,
                        AuthenticationLevel = RdpAuthenticationLevel.NoServerAuthentication,
                        BitmapPersistence   = RdpBitmapPersistence.Disabled,
                        DesktopSize         = RdpDesktopSize.ClientSize
                    });

                    AwaitEvent <RemoteDesktopConnectionSuceededEvent>();

                    Thread.Sleep(5000);
                    session.ShowSecurityScreen();
                    Thread.Sleep(1000);
                    session.SendKeys(Keys.Menu, Keys.S); // Sign out.

                    AwaitEvent <RemoteDesktopWindowClosedEvent>();
                    Assert.IsNull(this.ExceptionShown);
                }
        }
        public async Task WhenCredentialsValid_ThenConnectingSucceeds(
            [Values(RdpConnectionBarState.AutoHide, RdpConnectionBarState.Off, RdpConnectionBarState.Pinned)]
            RdpConnectionBarState connectionBarState,

            [Values(RdpDesktopSize.ClientSize, RdpDesktopSize.ScreenSize)]
            RdpDesktopSize desktopSize,

            [Values(RdpAudioMode.DoNotPlay, RdpAudioMode.PlayLocally, RdpAudioMode.PlayOnServer)]
            RdpAudioMode audioMode,

            [Values(RdpRedirectClipboard.Disabled, RdpRedirectClipboard.Enabled)]
            RdpRedirectClipboard redirectClipboard,

            // Use a slightly larger machine type as all this RDP'ing consumes a fair
            // amount of memory.
            [WindowsInstance(MachineType = "n1-standard-2")] ResourceTask <InstanceLocator> testInstance,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential)
        {
            var locator = await testInstance;

            using (var tunnel = RdpTunnel.Create(
                       locator,
                       await credential))
                using (var gceAdapter = new ComputeEngineAdapter(this.serviceProvider.GetService <IAuthorizationAdapter>()))
                {
                    var credentials = await gceAdapter.ResetWindowsUserAsync(
                        locator,
                        CreateRandomUsername(),
                        TimeSpan.FromSeconds(60),
                        CancellationToken.None);

                    var settings = VmInstanceConnectionSettings.CreateNew(
                        locator.ProjectId,
                        locator.Name);
                    settings.Username.StringValue          = credentials.UserName;
                    settings.Password.Value                = credentials.SecurePassword;
                    settings.ConnectionBar.EnumValue       = connectionBarState;
                    settings.DesktopSize.EnumValue         = desktopSize;
                    settings.AudioMode.EnumValue           = audioMode;
                    settings.RedirectClipboard.EnumValue   = redirectClipboard;
                    settings.AuthenticationLevel.EnumValue = RdpAuthenticationLevel.NoServerAuthentication;
                    settings.BitmapPersistence.EnumValue   = RdpBitmapPersistence.Disabled;

                    var rdpService = new RemoteDesktopConnectionBroker(this.serviceProvider);
                    var session    = rdpService.Connect(
                        locator,
                        "localhost",
                        (ushort)tunnel.LocalPort,
                        settings);

                    AwaitEvent <ConnectionSuceededEvent>();
                    Assert.IsNull(this.ExceptionShown);


                    ConnectionClosedEvent expectedEvent = null;

                    this.serviceProvider.GetService <IEventService>()
                    .BindHandler <ConnectionClosedEvent>(e =>
                    {
                        expectedEvent = e;
                    });
                    session.Close();

                    Assert.IsNotNull(expectedEvent);
                }
        }