SID weiterverarbeiten

  • Hallo,

    ich habe bereits AutoIt Scriptomatic und GetSID von ytwinky ausprobiert.
    Leider bekomme ich die SID nicht so raus wie ich die haben will.
    Mit Scriptomatic zeigt er alle nacheinander an, mit GetSID kann ich die SID des aktuellen Benutzers richtig gut auslesen.
    Wenn ich die SID aber in die Zwischenablage kopieren lasse sind die Anführungszeichen dabei.

    Ich brauche aber nur die SID, weil ich die dann in einen Registry-Tweak
    einfügen will.

    Wie mach ich das? Danke für eure Hilfe

  • Hi,

    ich hab die GetSID von ytwinky genommen und das False gegen True ausgetauscht, damit nur die SID vom angemeldeten Benutzer angezeigt wird. In die Zwischenablage wird "Gesucht: SID" "Benutzer" kopiert.
    Was kann ich am Code alles weglassen bzw. muss geändert werden um nur die SID weiterverarbeiten zu können? Will auf verschiedenen Rechnern was in den Reg-Schlüssel HKU\"hier steht die SID"\Software\Microsoft eintragen.
    Aber wie nebenan schon richtig steht: Grünschnabel.

    Spoiler anzeigen
    [autoit]

    GetSid angepasst
    ; Erstellt von AutoIt Scriptomatic
    ;umgearbeitet von ytwinky ;-)))
    Msgbox(1, "GetSid, aber richtig..", myGetSID("", "", 0))
    Func myGetSID($User=@UserName, $Host=@ComputerName, $NurEiner=True)
    Local $wbemFlagReturnImmediately=0x10, $wbemFlagForwardOnly=0x20, $colItems="", $angemeldet="Angemeldet: "
    Local $JaNein[2]=[True, False], $Gesucht="Gesucht: "
    If $User="" Then $User=@UserName
    If StringInstr($Host, "\\")=1 Then $Host=StringMid($Host, 3)
    If $Host="" Then $Host="."
    $NurEiner=$JaNein[$NurEiner=True]
    $Output="Computer: " &$Host &@Cr
    $Output&=StringFormat("%50s", "SID") &StringFormat("%60s", "Name") &@Cr
    $objWMIService=ObjGet("winmgmts:\\" &$Host &"\root\CIMV2")
    If IsObj($objWMIService) Then
    $colItems=$wbemFlagReturnImmediately+$wbemFlagForwardOnly
    $colItems=$objWMIService.ExecQuery("SELECT * FROM Win32_AccountSID", "WQL", $colItems)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $s=$objItem.Setting
    $s=StringMid($s, StringInStr($s, "SID=")+4) &@Tab
    $s&=StringMid($objItem.Element, StringInStr($objItem.Element, "Name=")+5)
    If StringInstr($s, Chr(34) &$User &Chr(34)) Then $Gesucht&=$s
    If StringInstr($s, Chr(34) &@UserName &Chr(34)) Then $angemeldet&=$s
    $OutPut&=StringReplace($s, Chr(34), "") &@Cr
    Next
    If $NurEiner Then Return StringReplace($Gesucht &@Cr &$angemeldet, Chr(34), "") & ClipPut($Gesucht)
    Return $OutPut &@Cr &StringReplace($angemeldet, Chr(34), "")
    Else
    Return "Keine WMI-Objekte gefunden für Klasse: Win32_AccountSID"
    Endif
    Else
    Return $Host &" ist nicht in diesem Netz.."
    EndIf
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    HI,

    dein Code lief bei mir irgendwie nicht.

    Ich habe es mal so probiert:

    Spoiler anzeigen
    [autoit]

    Dim $SID

    [/autoit] [autoit][/autoit] [autoit]

    $SID = _UserSID()
    ;$SID = _UserSID("UserName")
    ;$SID = _UserSID('UserName', 'RemoteComputerName')

    [/autoit] [autoit][/autoit] [autoit]

    If IsArray($SID) Then
    For $x = 1 To $SID[0][0]
    ;MsgBox(0, 'User SID', $SID[0][$x] & ' ====> ' & $SID[1][$x])
    If $SID[0][$x] == @UserName Then MsgBox(0, 'User SID', $SID[0][$x] & ' ====> ' & $SID[1][$x])
    Next
    Else
    MsgBox(0, "", "Is not an Array.")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _UserSID()
    ;
    ; Description: Return a 2 dimensional array first username second SID.
    ;
    ; Syntax: _UserSID ( [$s_UserName, $s_RemoteComputer] )
    ;
    ; Parameter(s): $s_UserName = Username to get SID.
    ; $s_RemoteComputer = ComputerName on the network
    ;
    ; Requirement(s): External: = None.
    ; Internal: = None.
    ;
    ; Return Value(s): On Success: = Returns 2 dimensional array with UserName, SID and sets @error to 0.
    ; On Failure: = Returns "" and sets @error to 1.
    ;
    ; Author(s): Dan Colón
    ;
    ; Note(s):
    ;
    ; Example(s):
    ; _UserSID("DColon") it will return DColon SID
    ; _UserSID() it will return every user SID
    ;===============================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Func _UserSID($s_UserName = "All", $s_RemoteComputer = '')
    If $s_UserName = '' Then $s_UserName = 'All'
    If $s_RemoteComputer <> '' Then
    If StringMid($s_RemoteComputer, 1, 1) <> '\' Or StringMid($s_RemoteComputer, 2, 1) <> '\' Or StringRight($s_RemoteComputer, 1) <> '\' Then
    $s_RemoteComputer = '\\' & StringReplace($s_RemoteComputer, '\', '') & '\'
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $line, $var, $ProfilePath, $i = 1
    Local Const $regkey = $s_RemoteComputer & "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\"
    Local Const $regkeyval1 = "ProfilesDirectory"
    Local Const $regkeyval2 = "ProfileImagePath"

    [/autoit] [autoit][/autoit] [autoit]

    $ProfilePath = RegRead($regkey, $regkeyval1)
    While 1
    $line = RegEnumKey($regkey, $i)
    $var = RegRead($regkey & $line, $regkeyval2)
    If @error = 1 Or @error = -1 Then ExitLoop
    If $s_UserName == "All" Then
    If Not IsDeclared("aArray") Then Dim $aArray[1][1]
    ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
    $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
    $aArray[1][UBound($aArray) - 1] = $line
    $aArray[0][0] = UBound($aArray) - 1
    ElseIf StringLower($var) == StringLower($ProfilePath & "\" & $s_UserName) Then
    If Not IsDeclared("aArray") Then Dim $aArray[1][1]
    ReDim $aArray[UBound($aArray) + 1][UBound($aArray) + 1]
    $aArray[0][UBound($aArray) - 1] = StringMid($var, StringInStr($var, '\', 0, -1) + 1)
    $aArray[1][UBound($aArray) - 1] = $line
    $aArray[0][0] = UBound($aArray) - 1
    EndIf
    $i = $i + 1
    WEnd
    If Not IsDeclared("aArray") Then
    SetError(1)
    Return ("")
    Else
    SetError(0)
    Return ($aArray)
    EndIf
    EndFunc ;==>_UserSID

    [/autoit]

    So long,

    Mega

  • Hi,

    mir gehts leider genauso das der Code nicht geht.
    Es erscheint nur ganz kurz das Symbol neben der Uhr und dann ists wieder weg. Aber keine Fehlermeldung in Scite.

  • Ja,

    hab ich getestet, aber leider wie oben beschrieben nur ganz kurz das Symbol neben der Uhr und dann wieder weg.

    • Offizieller Beitrag

    Hier, geht einwandfrei. Ist etwas angepaßt, geht jetzt nur für 1 User.

    Spoiler anzeigen
    [autoit]

    #include <guiconstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $user = "Standard" ; oder wer auch immer
    $var = StringSplit(myGetSID($user), @TAB)
    MsgBox(0, 'SID von ' & $user, $var[1])

    [/autoit] [autoit][/autoit] [autoit]

    Func myGetSID($User=@UserName, $Host=@ComputerName, $NurEiner=True)
    Local $wbemFlagReturnImmediately=0x10, $wbemFlagForwardOnly=0x20, $colItems=""
    Local $JaNein[2]=[True, False], $Gesucht="", $Output, $i, $s
    If $User="" Then $User=@UserName
    If StringInstr($Host, "\\")=1 Then $Host=StringMid($Host, 3)
    If $Host="" Then $Host="."
    $NurEiner=$JaNein[$NurEiner=False]
    $objWMIService=ObjGet("winmgmts:\\" &$Host &"\root\CIMV2")
    If IsObj($objWMIService) Then
    $colItems=$wbemFlagReturnImmediately+$wbemFlagForwardOnly
    $colItems=$objWMIService.ExecQuery("SELECT * FROM Win32_AccountSID", "WQL", $colItems)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $s=$objItem.Setting
    $s=StringMid($s, StringInStr($s, "SID=")+4) &@Tab
    $s&=StringMid($objItem.Element, StringInStr($objItem.Element, "Name=")+5)
    If StringInstr($s, Chr(34) &$User &Chr(34)) Then $Gesucht&=$s
    $OutPut&=StringReplace($s, Chr(34), "") &@Cr
    Next
    If $NurEiner Then Return StringReplace($Gesucht, Chr(34), "")
    Else
    Return "Keine WMI-Objekte gefunden für Klasse: Win32_AccountSID"
    Endif
    Else
    Return $Host &" ist nicht in diesem Netz.."
    EndIf
    EndFunc

    [/autoit]
  • Vielen Dank,

    klappt wunderbar.

    th.meger
    Dein Code klappt jetzt bei mir zu Hause auch wunderbar.
    Aber auf der Arbeit hat das nicht geklappt seltsamerweise.

    Danke nochmal an th.meger und Bugfix.
    Ihr habt mir viel weitergeholfen.

  • Zitat

    Original von Tyrael
    ich hab die GetSID von ytwinky genommen und das False gegen True ausgetauscht


    Das wäre gar nicht nötig gewesen :D
    Einfach nur den Aufruf ändern von

    Code
    GetSid("", "", 0)


    in

    Code
    GetSid("", "", 1)

    ..schon geht das nur mit dem angemeldeten User
    Bei variablen Parametern kann das mit dem Aufruf gesteuert werden..
    Wenn es jetzt funktioniert freut es mich natürlich ^^
    Tut mir leid, ich hab das erst jetzt gesehen..
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..