Toon posts:

[VB.net 2.0] Copy commando onder andere gebruiker

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als je een PCL printopdracht opslaat in een bestand (voorbeeld: fakturen.prn) dan kun je deze met een copy commando kopieren naar een geshared printer waarna deze mooi uitgepirnt wordt.

voorbeeld:

copy fakturen.prn //mijnserver/hp4000

Nu probeer ik een programma in vb.net te schrijven die dit doet onder andere gebruikersnaam. Alles gaat goed, aanmaken van de gebruikers etc, alleen de printopdracht wordt niet gekopieerd. Ook als ik hem wil kopieren naar een andere directory dan gebeurt dit niet.

Mijn code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Imports System.IO
Imports System.Diagnostics

Public Class Form1

    Public watchfolder As FileSystemWatcher
    Public ComputerName As String
    Public PrintQueue As String
    Public Password As String
    Public ini As New iniFile(Environment.CurrentDirectory + "\settings.ini")

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        Password = "P@ssw0rd"

        watchfolder = New System.IO.FileSystemWatcher()

        'this is the path we want to monitor
        watchfolder.Path = ini.GetString("main", "folder", "")

        'Add a list of Filter we want to specify
        'make sure you use OR for each Filter as we need to
        'all of those 

        watchfolder.NotifyFilter = IO.NotifyFilters.DirectoryName
        watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                                   IO.NotifyFilters.FileName
        watchfolder.NotifyFilter = watchfolder.NotifyFilter Or _
                                   IO.NotifyFilters.Attributes

        ' add the handler to each event
        AddHandler watchfolder.Created, AddressOf CopyJob
        MsgBox(ini.FileName)
        MsgBox(watchfolder.Path)
        'Set this property to true to start watching
        watchfolder.EnableRaisingEvents = True


    End Sub

    Private Sub StartCommand(ByVal Command As String, ByVal Args As String, 
ByVal User As String, ByVal Password As String, ByVal WorkDir As String)
        Dim ProcessInfo As New ProcessStartInfo
        Dim sstr As New System.Security.SecureString
        Dim pwd As String = Password

        Dim chars() As Char = pwd.ToCharArray()

        Dim i As Integer

        For i = 0 To chars.Length - 1
            sstr.AppendChar(chars(i))
        Next
        ProcessInfo.UseShellExecute = False
        ProcessInfo.UserName = User
        ProcessInfo.Password = sstr
        ProcessInfo.FileName = Command
        ProcessInfo.Arguments = Args
        ProcessInfo.WorkingDirectory = WorkDir
        ProcessInfo.WindowStyle = ProcessWindowStyle.Hidden
        ProcessInfo.CreateNoWindow = True

        Dim myProcess As New Process()
        myProcess.StartInfo = ProcessInfo
        myProcess.Start()

    End Sub

    Private Sub CreateUser(ByVal User As String)
        'Create Account
        Dim strUser As String = User
        Dim oDomain As Object = GetObject("WinNT://" + ComputerName)
        Dim oUser As Object = oDomain.Create("user", strUser)
        If (Err.Number = 0) Then
            oUser.SetInfo()
            oUser.SetPassword(Password)
            oUser.SetInfo()
        End If
    End Sub

    Private Sub DeleteUser(ByVal User As String)
        Dim strUser As String = User
        Dim oDomain As Object = GetObject("WinNT://" + ComputerName)
        Try
            Dim oUser As Object = oDomain.Delete("user", strUser)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    Private Sub CopyJob(ByVal source As Object, ByVal e As 
System.IO.FileSystemEventArgs)
        Dim filename As String = e.FullPath
        MsgBox(filename)
        ComputerName = System.Environment.MachineName
        PrintQueue = ini.GetString("main", "printqueue", "")
        Dim Username As String = ""

        If Not e.Name.IndexOf("_") = -1 Then
            Dim NewOwner() As String = e.Name.ToString.Split("_")
            Username = NewOwner(0)
        End If

        If Not Username = "" Then
            DeleteUser(Username)
            CreateUser(Username)
            StartCommand("c:\windows\system32\cmd.exe", "/c copy " & 
filename & " " & PrintQueue, Username, Password, watchfolder)
            DeleteUser(Username)
            MsgBox("Done")
        End If


    End Sub

End Class

[ Voor 5% gewijzigd door Verwijderd op 17-01-2006 15:26 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

je zal aan de slag moeten met .NET security denk ik...

edit:
oops, my fault...

heb je al geprobeerd om de uitvoer van je commando op te vragen/loggen ??? daar kan je mss wel eens wijzer uit worden...

probeer eens een cmd shell op te starten onder de andere user. ik weet dat er een commando bestaat waarmee je alle huidige SID's kunt opvragen, maar ik weet niet of je in die shell dan ook die SID's te zien zal krijgen of enkel die van de ingelogde gebruiker.

maak ook dat secondary logon service aan staat!

[ Voor 82% gewijzigd door H!GHGuY op 17-01-2006 19:58 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
Ik krijg geen uitvoer op dat commando.

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Kijk eens naar Impersonation.
Probeer anders eerst dit programmatje onder jouw eigen gebruikersnaam te testen en bouw daarna de logica in om het onder een andere user uit te voeren. Dan weet je tenminste zeker dat het in je impersonatie zit en niet in je programma code.

Nu met Land Rover Series 3 en Defender 90


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Kan zijn dat het niet uitmaakt, maar zijn sharenamen bij Windows niet met backslashes? Dan zou je copy commando dus:
copy fakturen.prn \\mijnserver\hp4000

Anders zal cmd het waarschijnlijk als een parameter zien.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Je zal het probleem eerst moeten isoleren voordat je het kan oplossen.

Ik ga je code niet lezen (volgens mij heb je iets meer neergekwakt dan alleen "het relevante gedeelte") maar vang je bij iedere stap de excepties op? Zo kan je makkelijk isoleren waar het fout gaat, het oplossen zal dan waarschijnlijk een stuk eenvoudiger zijn.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Verwijderd

Topicstarter
kenneth schreef op woensdag 18 januari 2006 @ 10:53:
Je zal het probleem eerst moeten isoleren voordat je het kan oplossen.

Ik ga je code niet lezen (volgens mij heb je iets meer neergekwakt dan alleen "het relevante gedeelte") maar vang je bij iedere stap de excepties op? Zo kan je makkelijk isoleren waar het fout gaat, het oplossen zal dan waarschijnlijk een stuk eenvoudiger zijn.
Aan alle die gereageerd hebben:

Dit is lang niet alle code, alleen relevante:

- aanmaken gebruiker
- starten printproces onder die gebruiker
- waar printopdracht vandaan kwam

Er treden geen exceptions op.

Slashes stonden in post verkeer maar in programma juist.

Impersation wordt voor andere doeleinden gebruikt.

In een dosbox gaat het goed. Alleen zodra je het via process.start probeert dan geen resultaat.

Ik zal dan maar gericht vragen waarom kan ik in dos promt wel prn bestand printen en in process.start niet?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat gebeurt er als je het process niet hidden start, maar gewoon windowed?

Verwijderd

Topicstarter
bigbeng schreef op woensdag 18 januari 2006 @ 11:33:
Wat gebeurt er als je het process niet hidden start, maar gewoon windowed?
Hetzelfde

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

zet eens wat simpele code na die process.start() en break daar...

kijk dan naar de eigenschappen van je process... verbind evt ook de uitvoer daarvan met een logger of zoiets... ik denk dat er ergens informatie verborgen is die je moet kunnen zien.

werkt System.IO.File.Copy (of zoiets) niet ?

ASSUME makes an ASS out of U and ME


Verwijderd

Topicstarter
HIGHGuY schreef op woensdag 18 januari 2006 @ 15:19:
zet eens wat simpele code na die process.start() en break daar...

kijk dan naar de eigenschappen van je process... verbind evt ook de uitvoer daarvan met een logger of zoiets... ik denk dat er ergens informatie verborgen is die je moet kunnen zien.

werkt System.IO.File.Copy (of zoiets) niet ?
ik heb al gedebugged

ik moet via command promt copy opdracht uitvoeren

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Geef nou gewoon eens wat meer informatie, je bent steeds erg kortaf. Wat moeten we met een opmerking als "Ik heb al gedebugged". Wat waren je bevindingen? Kwam er wel een scherm tevoorschijn? Startte je proces wel echt op? Wat zie je?
Veel verder dan dit is mijn code en "Hij doet het niet" is het niet gekomen. Probeer ons te voorzien van informatie en wij voorzien jou van onze onmetelijke (maar niet oneindige) kennis :)
Pagina: 1