albertminrich
Goto Top

Programm als anderer User starten mit gleichem Passwort

Hallo,

ich bin angemeldet als UserA und möchte ein Programm (z.B. cmd.exe) starten als UserB.
Geht so:
runas /user:MyDomain\UserB cmd.exe
Jetzt werde ich nach dem Passwort gefragt und cmd startet.

Ich möchte das ganze aber ohne Passwortabfrage. Die Passwörter der beiden User sind gleich.
Gibt's da irgendeine Möglichkeit? Mit runas wohl eher nicht, aber evtl. andere Tools?
Also, ich möchte nicht irgendwo ein Passwort hinterlegen oder fest eintragen, sondern es soll einfach das Passwort von UserA verwendet werden. Da die Passwörter gleich sind, passt das immer für UserB.

Danke
Gruß
Martin

Content-ID: 4735406268

Url: https://administrator.de/contentid/4735406268

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

DerWoWusste
DerWoWusste 23.11.2022 um 17:27:44 Uhr
Goto Top
Warum möchtest Du zwei verschiedene Nutzer dafür? Da das Kennwort absichtlich gleich ist, kann "Sicherheit" doch nicht der Grund sein, oder?

Ich würde meinen Ansatz dafür empfehlen: Tipp zur Nutzung von Zweitaccounts unter Windows - so eine PIN einzugeben kostet dich lediglich 2 Sekunden.
Das allerdings programmatisch zu tun (wie Dein runas-Befehl es tut), ist etwas aufwendiger. Hier ein Powershell Skript:

Function Get-SmartCardCred{
<#
.SYNOPSIS
Get certificate credentials from the user's certificate store.  

.DESCRIPTION
Returns a PSCredential object of the user's selected certificate.  

.EXAMPLE
Get-SmartCardCred
UserName                                           Password
--------                                           --------
@@BVkEYkWiqJgd2d9xz3-5BiHs1cAN System.Security.SecureString

.EXAMPLE
$Cred = Get-SmartCardCred

.OUTPUTS
[System.Management.Automation.PSCredential]

.NOTES
Author: Joshua Chase
Last Modified: 01 August 2018
C# code used from https://github.com/bongiovimatthew-microsoft/pscredentialWithCert
#>
[cmdletbinding()]
param()

    $SmartCardCode = @"  
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Management.Automation;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography.X509Certificates;


namespace SmartCardLogon{

    static class NativeMethods
    {

        public enum CRED_MARSHAL_TYPE
        {
            CertCredential = 1,
            UsernameTargetCredential
        }

        [StructLayout(LayoutKind.Sequential)]
        internal struct CERT_CREDENTIAL_INFO
        {
            public uint cbSize;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public byte rgbHashOfCert;
        }

        [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]  
        public static extern bool CredMarshalCredential(
            CRED_MARSHAL_TYPE CredType,
            IntPtr Credential,
            out IntPtr MarshaledCredential
        );

        [DllImport("advapi32.dll", SetLastError = true)]  
        public static extern bool CredFree([In] IntPtr buffer);

    }

    public class Certificate
    {

        public static PSCredential MarshalFlow(string thumbprint, SecureString pin)
        {
            //
            // Set up the data struct
            //
            NativeMethods.CERT_CREDENTIAL_INFO certInfo = new NativeMethods.CERT_CREDENTIAL_INFO();
            certInfo.cbSize = (uint)Marshal.SizeOf(typeof(NativeMethods.CERT_CREDENTIAL_INFO));

            //
            // Locate the certificate in the certificate store 
            //
            X509Certificate2 certCredential = new X509Certificate2();
            X509Store userMyStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            userMyStore.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection certsReturned = userMyStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
            userMyStore.Close();

            if (certsReturned.Count == 0)
            {
                throw new Exception("Unable to find the specified certificate.");  
            }

            //
            // Marshal the certificate 
            //
            certCredential = certsReturned;
            certInfo.rgbHashOfCert = certCredential.GetCertHash();
            int size = Marshal.SizeOf(certInfo);
            IntPtr pCertInfo = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(certInfo, pCertInfo, false);
            IntPtr marshaledCredential = IntPtr.Zero;
            bool result = NativeMethods.CredMarshalCredential(NativeMethods.CRED_MARSHAL_TYPE.CertCredential, pCertInfo, out marshaledCredential);

            string certBlobForUsername = null;
            PSCredential psCreds = null;

            if (result)
            {
                certBlobForUsername = Marshal.PtrToStringUni(marshaledCredential);
                psCreds = new PSCredential(certBlobForUsername, pin);
            }

            Marshal.FreeHGlobal(pCertInfo);
            if (marshaledCredential != IntPtr.Zero)
            {
                NativeMethods.CredFree(marshaledCredential);
            }
        
            return psCreds;
        }
    }
}
"@  

    Add-Type -TypeDefinition $SmartCardCode -Language CSharp
    Add-Type -AssemblyName System.Security

    $ValidCerts = [System.Security.Cryptography.X509Certificates.X509Certificate2[]](Get-ChildItem 'Cert:\CurrentUser\My')  
    $Cert = [System.Security.Cryptography.X509Certificates.X509Certificate2UI]::SelectFromCollection($ValidCerts, 'Choose a certificate', 'Choose a certificate', 0)  

    $Pin = Read-Host "Enter your PIN: " -AsSecureString  

    Write-Output ([SmartCardLogon.Certificate]::MarshalFlow($Cert.Thumbprint, $Pin))
}
$cred=Get-SmartCardCred
$StartInfo = New-Object System.Diagnostics.ProcessStartInfo
$StartInfo.FileName = 'cmd'  
$StartInfo.UseShellExecute = $false
$StartInfo.UserName = $Cred.Username
$StartInfo.Password = $Cred.Password
$StartInfo.WorkingDirectory = $env:windir
$StartInfo.LoadUserProfile = $true
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $StartInfo
$Process.Start()
$Cred = $null
erikro
erikro 23.11.2022 um 17:40:40 Uhr
Goto Top
Moin,

Zitat von @DerWoWusste:

Warum möchtest Du zwei verschiedene Nutzer dafür? Da das Kennwort absichtlich gleich ist, kann "Sicherheit" doch nicht der Grund sein, oder?

Na der eine ist sein eingeschränkter User und der andere ist der DomAdmin. Sach bloß Du hast da verschiedene Passwörters für? *eg*

Liebe Grüße

Erik
Crusher79
Lösung Crusher79 23.11.2022 aktualisiert um 19:10:14 Uhr
Goto Top
Dann speicher doch das Kennwort!

Kann man auch mit PowerShell vorfüllen: https://childebrandt42.wordpress.com/2020/07/07/using-windows-credential ...

Über den Schalter ist es aber einfacher. Dann fragt es nie wieder. Via Script könnte man das auf andere Systeme deployen. Sicherheit ist natürlich bei gleichen Kennwörtern u.ä. fraglich.

runas /user:Crusher /savecred cmd.exe

23-11-_2022_19-06-27

Kennwort Pipen geht leider nicht. Siehe hier : https://devblogs.microsoft.com/oldnewthing/20041129-00/?p=37183
Crusher79
Crusher79 23.11.2022 um 19:16:31 Uhr
Goto Top
Also, ich möchte nicht irgendwo ein Passwort hinterlegen oder fest eintragen, sondern es soll einfach das Passwort von UserA verwendet werden. Da die Passwörter gleich sind, passt das immer für UserB.

Dazu fällt mir noch dies hier ein. Aber das kann man sich nciht merken.

So oder so müsste man ja dann das Kennwort reinnehmen. Mehr fällt mir leider nicht ein......

$username = 'tv'  
$password = '1234'  

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process cmd.exe -Credential $credential

23-11-_2022_19-14-56
DerWoWusste
DerWoWusste 24.11.2022 um 09:41:10 Uhr
Goto Top
@Crusher79
Dieser Savecred-Tipp ist wie immer mit Vorsicht zu genießen, hat doch so ein jeder Prozess, den Nutzer A startet, freien Zugriff auf die Credentials von Nutzer B. Nicht nur cmd.exe.
Crusher79
Crusher79 24.11.2022 aktualisiert um 10:04:16 Uhr
Goto Top
@DerWoWusste ja ist schwierig.

Lansweeper hat dafür auf der Device Page anpasspare Menüpunkte. Nutze das für Enter-PSsession. Man kann Creds hinterlegen und dann beliebige Software aufrufen. Aber meist auch nur im admin Kontext.

Pipen ist halt nich vorgesehen. Zwar nervig - aber nicht zu ändern.

Task-Scheduler wäre noch was. Task unter den User ausführen. Hab so mal bei eingeloggten outlook repariert. Exchange PF Verschiebung schlug wegen Searchbox fehl. Kannst du ja mit outlook.exe /parameter rasch beheben. Wenn der Task unter den User läuft passt das.

In seinen Fall hieße dass nur wieder: Er sieht nichts. Da die CMD unter dem andere User Kontext ausfgeführt wird. Je nach dem was er da startenj will, könnte man nur die Ausgabe pipen und umleiten.

Wenn er eh die Kennwörter hat, wäre also ein eingeloggter User kein Problem. Nur wieder das ganze drum herum.

Ob sich das lohnt.... Und sicherheitstechnisch hat man da auch Fragen....
AlbertMinrich
AlbertMinrich 24.11.2022 um 13:33:57 Uhr
Goto Top
Wir lösen es jetzt hiermit:
runas /user:Crusher /savecred cmd.exe

Und keine Panik, das ganze ist völlig sicherheitsunkritisch. Es geht nur um den Aufruf des Ticketsystems
UserB soll im Ticketkonto von UserA landen, damit sie die gleichen Tickets sehen.

Danke an alle
Gruß
Martin
DerWoWusste
DerWoWusste 24.11.2022 um 13:41:43 Uhr
Goto Top
Gut, dann mach das so.
Also, ich möchte nicht irgendwo ein Passwort hinterlegen
War etwas irreführend, da savecred ja genau das macht: es hinterlegt das Passwort.
Crusher79
Crusher79 24.11.2022 um 13:43:12 Uhr
Goto Top
Schlechtes Tickt Sytsem ^^

Normal kann man doch auch Gruppen Bilden u.ä. face-wink

Zammad hat @ Name Feature um Leser "einzuladen" face-wink Vermutlich dan so die beste Lösung für dich face-wink
AlbertMinrich
AlbertMinrich 24.11.2022 um 15:46:11 Uhr
Goto Top
Zitat von @DerWoWusste:

Gut, dann mach das so.
Also, ich möchte nicht irgendwo ein Passwort hinterlegen
War etwas irreführend, da savecred ja genau das macht: es hinterlegt das Passwort.

Ja stimmt, aber wenn's halt nicht anders geht